LeetCode 5.最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
- 1 <= s.length <= 1000
- s 仅由数字和英文字母(大写和/或小写)组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
方法一:动态规划
class Solution {
public:
string longestPalindrome(string s) {
int n = s.length();
if(n < 2){
return s;
}
int maxlen = 1;
int begin = 0;
vector<vector<bool>> dp(n,vector<bool>(n));
for(int i = 0; i < n ; i++){
dp[i][i] = true;
}
for(int j = 1; j < n; j++){
for(int i = 0; i < j; i++){
if(s[i] != s[j]){
dp[i][j] = false;
}
else{
if(j - i < 3){ //字符串长度小于3,若s[i]==s[j],则i到j的字符串一定是回文串
dp[i][j] = true;
}
else{
dp[i][j] = dp[i+1][j-1];
}
}
//更新起点和最长回文串的长度
if(dp[i][j] && j - i + 1 > maxlen){
begin = i;
maxlen = j - i + 1;
}
}
}
return s.substr(begin,maxlen);
}
};
方法二:中心扩散
class Solution {
public:
string Palindrome(string& s,int l,int r){
while(l >= 0 && r < s.length() && s[l] == s[r]){
l--;
r++;
}
return s.substr(l+1,r - l - 1); //(r-1)-(l+1)+1
}
string longestPalindrome(string s) {
string res;
for(int i = 0; i < s.size(); i++){
//寻找长度为奇数的回文子串(即以s[i]为中心的回文串)
string s1 = Palindrome(s,i,i);
//寻找长度为偶数的回文子串(即以s[i],s[i+1]为中心的回文串)
string s2 = Palindrome(s,i,i+1);
res = res.size() > s1.size() ? res : s1;
res = res.size() > s2.size() ? res : s2;
}
return res;
}
};