問題描述:給定一個字符串S,找出它的最長迴文子串。
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Input: "cbbd"
Output: "bb"
思路:可以採用動態規劃思想,定義dp[i][j]爲
dp[i][j]= true (如果子串 Si…Sj 是一個迴文串)
= false(如果子串 Si…Sj 不是一個迴文串)
於是可得dp[ i ] [ j ] = (dp[ i+1 ][ j-1 ] && S[ i ]==S[ j ]),即如果Si+1…Sj-1是一個迴文串且 S[ i ]==S[ j ],那麼Si…Sj 是一個迴文串。dp數組的初始值爲:
dp(i,i)=true
dp(i,i+1)=true if (Si==Si+1)
C++語言代碼如下:
bool dp[s.length()][s.length()]={false};
for(int i=0;i<s.length();++i){
dp[i][i]=true;
if(i<s.length()-1&&s[i]==s[i+1])
dp[i][i+1]=true;
}
for(int i=s.length()-1;i>0;--i){
for(int j=i;j<s.length()-1;++j){
if(dp[i][j]&&s[i-1]==s[j+1]){
dp[i-1][j+1]=true;
}
}
}
int maxlength=0;
for(int i=0;i<s.length();++i){
for(int j=i;j<s.length();++j){
if(maxlength<j-i+1)
maxlength=j-i+1;
}
}
return maxlength;