题意理解:
求解最长的回文;
题目分析:
1. 通过遍历完成,但算法的复杂度过高(O(N3));
2. 采用动态规划,复杂度为O(N2)(先前以为所谓的动态规划,就是像《算法导论》里车间的那个例子,从最终决策节点向终端节点进行递归,最终获得最优解。其实,只要是最终最优决策依赖于过程最优决策的方式都是动态规划)
解题代码:
class Solution {
public:
string longestPalindrome(string s) {
int sLen=s.length();
if(sLen<=1){
return s;
}
bool dp[sLen][sLen];
int maxLen=1;
int pos=0;
for(int i=0;i<sLen;i++){
dp[i][i]=true;
if(i+1<sLen){
if(s[i]==s[i+1]){
dp[i][i+1]=true;
maxLen=2;
pos=i;
// cout<<"pos= "<<pos<<endl;
}else{
dp[i][i+1]=false;
}
}
}
for(int len=3;len<=sLen;len++){
for(int i=0;i<sLen-len+1;i++){
if(dp[i+1][i+len-2] && s[i]==s[i+len-1]){
dp[i][i+len-1]=true;
pos=i;
maxLen=len;
}else{
dp[i][i+len-1]=false;
}
}
}
return s.substr(pos,maxLen);
}
};
会超时的穷举代码:
class Solution {
private:
bool isPalindromic(string s){
if(s.length()<=1){
return true;
}
int sLen=s.length();
int halfLen=sLen/2;
for(int i=0;i<halfLen;i++){
if(s[i]!=s[sLen-1-i]){
return false;
}
}
return true;
}
public:
string longestPalindrome(string s) {
if(s.length()==0 || s.length()==1){
return s;
}
string maxSubStr="";
for(int i=0;i<s.length();i++){
for(int j=i;j<s.length();j++){
string t=s.substr(i,j-i+1);
if(isPalindromic(t) && t.length()>maxSubStr.length()){
maxSubStr=t;
cout<<"maxSubStr= "<<maxSubStr<<endl;
}
}
}
return maxSubStr;
}
};