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"
注意:测试用例 ""、"a"、"ab"、"ccc"
解法一:暴力解题
string Solution::longestPalindrome(string s){
if(s==""){
return "";
}
string str;
for(int i=0;i<s.size()-1;i++){
for(int j=i+1;j<s.size();j++){
string temp(s,i,j-i+1);
if(isPalindrome(temp)){
if(temp.size()>str.size()){
str=temp;
}
}
}
}
if(str!=""){
return str;
}
string res("");
res+=s[0];
return res;
}
bool Solution::isPalindrome(string s){
if(s==""){
return true;
}
int startIndex=0;
int endIndex=s.size()-1;
while(startIndex<=endIndex){
if(s[startIndex]!=s[endIndex]){
return false;
}
startIndex++;
endIndex--;
}
return true;
}
算法复杂度太高,leetcode不能通过。
解法二:从子回文串的中心开始,向左右移动,"bob"的中心是o,"noon"的中心是oo的中心点,如果需要两个中心去移动。时间复杂度为O(n^n)
string Solution::longestPalindrome2(string s){
if(s.size()<2){
return s;
}
int n=s.size(),maxLen=0,start=0;
for(int i=0;i<n-1;i++){
searchPanlindrome(s,i,i,start,maxLen);
searchPanlindrome(s,i,i+1,start,maxLen);
}
return s.substr(start,maxLen);
}
void Solution::searchPanlindrome(string s,int left,int right,int &start,int &maxLen){
while(left>=0 && right<s.size() && s[left]==s[right]){
left--;
right++;
}
if(maxLen<right-left-1){
start=left+1;
maxLen=right-left-1;
}
}
解法三:动态规划
动态规划的思想是,用一个数组存储上一步的结果。举个栗子,“noon” dp[2][1]=1,因为o==o.下一步dp[3][0]==1,因为n==n,这时候在判断dp[3-1][0+1]是否为1,如果是的话,那么他们是子回文串,总得来说,就是本次的结果影响到下一次的结果。
string Solution::longestPalindromeDP(string s){
if(s.size()<2){
return s;
}
int dp[s.size()][s.size()]={0},left=0,right=0,len=0;
for(int i=0;i<s.size();i++){
for(int j=0;j<i;j++){
dp[j][i]=(s[i]==s[j] && (i-j<2 || dp[j+1][i-1]));
if(dp[j][i] && len<i-j+1){
len=i-j+1;
left=j;
right=i;
}
}
dp[i][i]=1;
}
return s.substr(left,right-left+1);
}