Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: "babad" Output: "bab" Note: "aba" is also a valid answer.
Example:
Input: "cbbd" Output: "bb"
题目大概意思就是找第一个最大的回文字符串;
这题有两种解法,
1.dp
dp的时间复杂度为O(n^2),似乎不是最好的方法
dp思路就是进行两次for循环,分别对i==j,i=j+1,s[i]==s[j]&&dp[i-1][j+1],进行讨论
class Solution {
public:
string longestPalindrome(string s) {
int n=s.size();
vector<vector<bool> >dp(n,vector<bool>(n));
string res="";
int max=1;
res=s.substr(0,1); //s.size()==1时的情况
for(int i=0;i<s.size();i++){
for(int j=0;j<=i;j++){
if(i==j) //i==j的情况
dp[j][i]=true;
else{
if(i==j+1) //i=j+1,即'aa'的情况
dp[j][i]=s[i]==s[j];
else //后续的回文处理
dp[j][i]=s[i]==s[j]&&dp[j+1][i-1];
if(dp[j][i]&&i-j+1>max){
max=i-j+1;
res=s.substr(j,max);
}
}
}
}
return res;
}
};
2、第二种方法就是从前往后寻找到回文开始的地方,然后分别往两边走,直到不再是回文
class Solution {
public:
string longestPalindrome(string s) {
int n=s.size();
if(n==0||n==1)return s;
string res="";
int max_l=1,min_l=0;
for(int i=0;i<n;){
if(n-i<=max_l/2)break;
int j=i,k=i;
while(k<n-1&&s[k]==s[k+1])k++;
i=k+1;
while(j>0&&k<n-1&&s[k+1]==s[j-1])k++,j--;
int new_len=k-j+1;
if(new_len>max_l){
min_l=j;
max_l=new_len;
}
res=s.substr(min_l,max_l);
}
return res;
}
};