当前位置: 代码迷 >> 综合 >> 动态规划-leetcode#10-最长回文
  详细解决方案

动态规划-leetcode#10-最长回文

热度:98   发布时间:2024-01-31 09:47:22.0
class Solution {
public://思路是,循环,i是字符串终止位置,j是字符串起始位置,//一开始担心,dp[j+1][i-1]会超过数组长度,越界,但是其实,走到这个else时候//j+1小于i,所以可以加1,i-1是前一轮迭代的结果,已经有了。//定义一个dp记录是不是回文,然后通过i-j+1的长度来更新res。//string.substr(起始位置,长度);而不是终止位置。//二维vector<>的初始化:vector<vector<bool>> dp(s.length(),vector<bool>(s.length(),false));string longestPalindrome(string s) {if(s.length()<=1) return s;vector<vector<bool>> dp(s.length(),vector<bool>(s.length(),false));string res= "";// 第二个变量是长度。for(int i=0;i<s.length();i++){for(int j=0;j<=i;j++){if(i==j) dp[j][i]=true;else if (i==j+1) dp[j][i]=(s[i]==s[j]);else{if(s[i]==s[j] && dp[j+1][i-1])dp[j][i]=true;}if( dp[j][i] && i-j+1>res.length()) res=s.substr(j,i-j+1);}}return res;}};

动态规划,挨个位置找,把一头,比如i代表字符串终止位置,就是以s[i]结尾的字符串,dp[i][j]就是从j开始到i的字符串是不是回文:

(1)如果i==j,说明长度为1,true

(2)如果j=i-1;说明挨着,那就比较s[i]和s[j],相等就是回文

  (3) 如果i-j距离大于等于2,是不是要对称地方挨个比呢,s[i-1]和s[j+1],s[i-2] 和s[j+2],直到相遇,但是dp已经存好了,走到以s[i]结尾的,那么以s[i-1]结尾的是否是回文已经存在dp中了,所以直接获取就可以,比较s[i]==s[j] && dp[i-1][j+1],为true了,那么就是回文。

在每次求出j-i是不是回文的过程种,通过substr可以更新全局最长回文。