博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode-05 最长回文子串(简单动态规划)
阅读量:4354 次
发布时间:2019-06-07

本文共 1227 字,大约阅读时间需要 4 分钟。

注意情况:s="" 则ans=""

 

基本思想:一个子串[i,j] 如果s[i]=s[j] 且子串[i+1,j-1]是回文子串,那么[i,j]是回文子串

 

使用数组记录状态,而非递归

dp[maxn][maxn] -> 若子串[i,j]是回文子串,则dp[i][j]表示它的长度,否则为0

逻辑上是使用数组,但是实际操作中使用了vector<vector<int>> dp(len,vector<int>(len))

(因为我不知道为什么使用数组时提交就会出错,虽然自己执行代码的话答案是正确的)

 

开始时的已知状态:s.size=1   => dp[i][i]=1

   s.size=2 => (1) s[i]=s[i+1] dp[i][i+1]=2

         (2) s[i]!=s[i+1] 不做操作

根据已知状态推测状态:状态转移方程:若dp[i+1][j-1]!=0 则dp[i][j]=dp[i+1][j-1]+2,否则不做操作

状态的计算,是根据子串长度从小到大依次计算的

class Solution {public:    string longestPalindrome(string s) {        if (s.size() == 0)return "";        int len = s.size();        vector
> dp(len, vector
(len)); int maxlen = 1, rei = 0; for (int i = 0;i
2) { for (int le = 3;le <= len;le++) { for (int i =0;i <=len-le;i++) { int j =i+le-1; if (dp[i + 1][j - 1] != 0 && s[i] == s[j]) { maxlen = le; dp[i][j] = maxlen; rei = i; } } } } string ans = s.substr(rei, maxlen); return ans; }};

 

转载于:https://www.cnblogs.com/suuusu/p/10982987.html

你可能感兴趣的文章
ActionBar
查看>>
5种方法实现数组去重
查看>>
2~15重点语法
查看>>
flask中的CBV,flash,Flask-Session,WTForms - MoudelForm,DBUtils 数据库连接池
查看>>
最近整理的提供免费代理列表的几个网站
查看>>
探偵ガリレオー転写る2
查看>>
快速排序算法C++实现[评注版]
查看>>
七尖记
查看>>
SAP(最短增广路算法) 最大流模板
查看>>
用极大化思想解决矩形问题学习笔记
查看>>
Django REST Framework 简单入门
查看>>
Hibernate中fetch和lazy介绍
查看>>
修改ip脚本
查看>>
解析xlsx与xls--使用2012poi.jar
查看>>
java5,java6新特性
查看>>
【LOJ】#2290. 「THUWC 2017」随机二分图
查看>>
SSL-ZYC 活动安排
查看>>
Git clone 报错 128
查看>>
在Python中执行普通除法
查看>>
编译原理(第三版) 语法分析器
查看>>