求公共子序列的思路:
假设A 串;B串,当第一个字符相等时就等于lena-1,lenb-1 的公共子序列的个数加一,当不相同的时候就是等于max(lena-1和lenb的公共,lena和lenb-1的公共)
所以就可以等到一个状态转移方程式。
而求公共子串的时候只要变一下就可以了。而下面就是求公共子串的。可以意会一下。
#include <stdio.h> #include <string.h> int main() { char a[105],b[105],c[105][105]; int t; scanf("%d", &t); while(t--) { memset(c,0,sizeof(c)); scanf("%s",a); int len=strlen(a); for(int i =0; i<len;i++) b[i]=a[len-1-i]; int max=-9999,ok; for(int i =1;i<=len;i++) { for(int j =1; j<=len;j++) { if(a[i-1]==b[j-1]) { c[i][j]=c[i-1][j-1]+1; } if(max<c[i][j]) { max=c[i][j]; ok=i; //记录下重点的下边再重新把它倒数。 } } } for(int i=ok-max;i<ok;i++) //因为要围城是0,所以是从1开始的然后就是当道i时其实是i-1的; printf("%c",a[i]); puts(""); } return 0; }