Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
即给你一个字符串,让你求出该字符串的最长回文子串
dp无悬念
if s[i]==s[j] f(i,j) = f(i+1,j-1)
else f(i,j) = false
一开始直接想到的是用二维string数组的dp,果然MLE
用二维bool的dp,还是MLE
考虑到所用到的数据只有二维数组中的上三角部分,所以可以再次节省空间
每次发现一个f(i,j)为true的时候,与当前所维护的最长回文字串作比较,如果比当前的长,则更新
class Solution {
public:
string longestPalindrome(string s) {
bool **f;
if(s.length()==1)
return s;
if(s.length()==2)
if(s[0]==s[1])
return s;
string maxi="";
int n = s.length();
f=new bool*[n];
for(int i=0;i<n;i++){
f[i] = new bool[n-i];
f[i][0] = 1;
}
for(int i=0;i<n-1;i++){
f[i][1] = (s[i]==s[i+1]);
if(f[i][1]){
if(2>maxi.length())
maxi = s.substr(i,2);
}
}
for(int i=n-3;i>=0;i--){
for(int j = 2;j<(n-i);j++){
if(s[i]==s[i+j]){
f[i][j] = f[i+1][j-2];
if(f[i][j]){
if((j+1)>maxi.length())
maxi = s.substr(i,j+1);
}
}else
f[i][j] = false;
}
}
return maxi;
}
};