力扣题解–
最长回文子串
5、最长回文子串
题目描述
解题思路:
- 这题要求的是最长回文字符串的具体内容。如果我们用暴力扫描肯定会超时的,针对回文串这类题目,可以考虑使用动态规划。dp[i][j]表示字符串从起始位置i到终止位置j是否是回文串,如果是dp[i][j]=1,否则就是0。首先赋初值dp[i][i]肯定是一个回文串。之后我们可以根据长度截取字符串,判断起始位置,终止位置的字符是否相等,如果相等那么继续判断从i+1到j-1是否是回文串,如果是,那就设置dp[i][j]=1。遍历过程记下起始位置和最长的长度。
代码如下:
class Solution {
public:
string longestPalindrome(string s) {
int len = s.size();
int max = 1,start =0 ;
vector<vector<int>> dp(len,vector<int>(len,0));
for(int i=0;i<len;i++){
dp[i][i]=1;
if(i<len-1&&s[i]==s[i+1]){
dp[i][i+1]=1;
max = 2;
start = i;
}
}
for(int l=3;l<=len;l++){
for(int i=0;i+l-1<len;i++){
int j = i+l-1;
if(s[i]==s[j]&&dp[i+1][j-1]==1){
dp[i][j]=1;
max = l;
start = i;
}
}
}
return s.substr(start,max);
}
};
总结:
回文串一类题目用动态规划,这题可以演变为求最长回文串的长度。