PAT 1040 求最长回文子串

来源:互联网 发布:客户关系维护软件 编辑:程序博客网 时间:2024/06/17 20:10


题意:求最长回文子串

思路:

用dp, dp[left][right] 代表了从left到right这个子串是不是回文子串。   利用这个状态能节省很多重复判断。

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<stack>#include<vector>#include<queue>#include<string>#include<map>using namespace std;#define INF 99999999#define M 1005int flagdp[M][M];int len;int fsym(char str[],int l,int r){if(l<0|| r>=len )return 0;if(l==r||l == r + 1)return 1;if(flagdp[l][r] == 1)return 1;else if(flagdp[l][r] == -1)return -1;if(str[l] == str[r]){flagdp[l][r] = fsym(str,l+1,r-1);}else flagdp[l][r]=-1;return flagdp[l][r];}int main(){int i,l,j,r,symlen,maxsymlen;memset(flagdp,0,sizeof(flagdp));char str[M];cin.getline(str,M);maxsymlen = 0;len=strlen(str);int flags;for(i=0;i<len;i++){for(j=len-1;j>=i;j--){flags = fsym(str,i,j);if(flags == 1 && maxsymlen< j - i + 1)maxsymlen=j-i+1;}}cout<<maxsymlen<<endl;}


原创粉丝点击