问题描述:给定一个字符串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;