题目:
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
解法一:暴力搜索法
class Solution {
public:
string longestPalindrome(string s) {
int n = s.length();
if(n < 2)
return s;
int len = 0;
int start = 0;
int end = 0;
for(int i = 0; i < s.length(); i++)
{
for(int j = i; j < s.length(); j++)
{
int k1 = i;
int k2 = j;
while(k1 <= k2 && s[k1] == s[k2])
{
k1++;
k2--;
}
if((k1 >= k2) && ((j - i + 1) > len))
{
len = j - i + 1;
start = i;
end = j;
}
}
}
//start起始位置,len长度
string res = s.substr(start,len);
return res;
}
};
解法二: 动态规划算法
原理如下图
1. dp[i][j]依赖dp[i+1][j-1],若dp[i+1][j-1]是回文子串,若str[i] == str[j] 则dp[i][j]也是回文子串
2. 若i和j中间只有一个字母,或者没有字母,j - i <= 2时,若str[i] == str[j] 则dp[i][j]也是回文子串
class Solution {
public:
int dp[1000][1000];
string longestPalindrome(string s) {
int n = s.length();
if(n < 2)
return s;
int begin = 0;
int end = 0;
int len = 1; //由于j = i + 1, len = 1;
memset(dp,0,1000*1000);
for(int i = n - 2; i >= 0; i--)
{
for(int j = i + 1; j <= n - 1; j++)
{
if(s[i] == s[j] &&(dp[i+1][j-1] || j - i <= 2))
{
dp[i][j] = 1;
if(j - i + 1 > len)
{
begin = i;
end = j;
len = j - i + 1;
}
}
}
}
string res = s.substr(begin,len);
return res;
}
};