LeetCode题解——最长回文子串
- 题目介绍
- 解题思路
- 方法一:暴力解题法,遍历字符串,以当前字符为中心向两边扩散,获取到最大的回文数长度
- 方法二:动态规划,判断一个字符串是不是回文,只要满足首尾相等,同时去除首尾后的字符串是一个回文字符串,那么这个字符串就是回文
- 现在我们用一个dp[i][j]数组来表示i到j是不是回文字符串,是的话值为1,否则为0,那么我们要判断i到j是否是回文只要判断s[i]==s[j]&&dp[i+1][j-1]是否为真
- 然后我们取出dp里面的最大值,就是我们想要的结果
- 代码示例
class Solution {
public:
string longestPalindrome(string s) {
int len = s.length();
int dp[len][len];
int max_len = 1;
int max_index = 0;
for(int i = 0;i+1 < len;i++){
dp[i][i] = 1; //每个单独的字符都是回文
if(s[i] == s[i+1]) {
dp[i][i+1] = 1;
max_len = 2;
max_index = i;
}else{
dp[i][i+1] = 0;
}
}
for(int l = 3; l <= len; l++){ //L是每次回文字符串的长度
for(int j = 0;j+l-1<len; j++){//j是下标
if(s[j] == s[j+l-1] && dp[j+1][j+l-2] == 1) { //是回文
dp[j][j+l-1] = 1;
max_len = l;
max_index = j;
}else{
dp[j][j+l-1] = 0;
}
}
}
return s.substr(max_index,max_len);
}
};