题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
中心扩散和动态规划法
class Solution {
public:
string longestPalindrome(string s)
{
int n = s.size();
if(n<2)
return s;
int left = 0,right = 0;
for(int i=0;i<n;++i)
{
int len1 = help(s,i,i);
int len2 = help(s,i,i+1);
int len = max(len1,len2);
if(len > right-left+1)
{
left = i-(len-1)/2;
right = i+len/2;
}
}
return s.substr(left,right-left+1);
}
int help(string s,int left,int right)
{
while(left>=0 && right<s.size() && s[left] == s[right])
{
left--;right++;
}
return right-left-1;
}
};
动态规划:
class Solution {
public:
string longestPalindrome(string s)
{
int n = s.size();
if(n == 0 || n == 1)
return s;
vector<vector<bool>> dp(n,vector<bool>(n,false));
int max_ = 0;
int left = 0,right = 0,max_len = 0;
for(int i=1;i<n;++i)
{
for(int j=0;j<=i;++j)
{
if(s[i] == s[j] && ((i-j) <3 || dp[i-1][j+1]))
{
dp[i][j] = true;
if(max_len < i - j +1)
{
left = j;
right = i;
max_len = right - left +1;
}
}
}
}
return s.substr(left,max_len);
}
};
解题思路:
中心扩散法很好理解不做赘述
动态规划法中,每次固定i的位置,让j从0开始遍历到i,利用dp[i-1][j+1]进行判断,更新最大长度,以及坐标。