最长回文子串

最长回文子串

给出一个字符串S,求出其最长回文子串的长度。

思路:

依次判断长度为1至N子串是否是回文串,每一种长度的子串,从左至右判断,结果存入DP[I][J].I为子串长度,J为子串开始位置。
边界条件是长度为1和2。长度为1的子串一定是回文串,即DP[1][*]=1;长度为2的子串直接比较两个字符即得结果,即DP[2][J]=(S[J]==S[J+1])?1:0。
当I>2时,判断S[J]与S[J+I-1]是否相等,如果相等,则DP[I][J]=DP[I-2][J+1],也就是如果S[J]与S[J+I-1]相等,那么从J到J+I-1这个长度为I的子串是否是回文串,取决于从J+1开始的长度为I-2的子串是否是回文串。如果不等,则DP[I][J]=0.
如果要记录最大的长度,那么每次找到一个相等的字符对时,判断一个其DP[I][J]值是否为1.如果为1,则说明这个子串是回文串,可以把它的长度I存入MAX,则循环结束后,MAX中存放的就是最长的回文串的长度。
最长回文子串

代码:

#include  <string> 
#include  <iostream> 
using namespace std;
int const maxN=100;
string s;
int dp[maxN][maxN];

int main(){
int n;//原始字符串的长度 
int i,j,re=1; 
cin>>s; 
n=s.size();
for(i=0;i<n;i++)dp[0][i]=1;
for(i=0;i<n;i++){
	if(s[i]==s[i+1]){
		dp[1][i]=1;
		re=2;
	}
}
for(i=2;i<n;i++){
	for(j=0;j<n-i;j++){
		if(s[j]==s[j+i]){
			dp[i][j]=dp[i-2][j+1];
			if(dp[i][j]==1)re=i+1;
		}
	}
}
cout<<re<<endl;
return 0;
}