5.最长回文子串
- 题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
5.最长回文子串
家人们直接学习代码了,孩子不会
- 学习代码
- 中心拓展
参考代码链接
遍历字符串每个字符,以该字符为中心向左右拓展,寻找以该字符为中心的回文串
class Solution {
public:
string longestPalindrome(string s) {
//中心拓展
int max_len = -1;
int left = 0;
for(int i = 0 ; i < s.length() ; i++){
int odd_len = maxlengh(s,i,i);
int even_len = maxlengh(s,i,i+1);
int length = max(odd_len,even_len);
if(length > max_len){
max_len = length;
left = i - (max_len - 1) / 2;
}
}
return s.substr(left,max_len);
}
int maxlengh(string s , int left , int right){
while(left >= 0 && right < s.length() && s[left] == s[right]){
left--;
right++;
}
return right - left - 1;
}
};
- 动态规划
参考代码链接
定义二维数组dp[i][j],i,j分别代表字符串的左右位置。
一个字符是回文串,即 j-i == 0;
两个相同字符是回文串,即 j-i == 1且s[i] == s[j]。
基于以上两种情况,若有s[i]==s[j]且dp[i+1][j-1] == true,那么dp[i][j]==true;
class Solution {
public:
string longestPalindrome(string s) {
bool dp[1000][1000] = {false};
int max_len = 0 , left = 0;
for(int i = s.length() - 1 ; i >= 0 ; i--){
for(int j = i ; j < s.length() ; j++){
if(s[i] == s[j]){
if(j - i <= 1){//a或aa
dp[i][j] = true;
}
else if(dp[i+1][j-1]){
dp[i][j] = true;
}
}
if(dp[i][j] && j - i + 1 >= max_len){//要有等于才会输出第一个最长回文串
max_len = j - i + 1;
left = i;
}
}
}
return s.substr(left,max_len);
}
};