注意区分啊~这里求的的事公共子串不是子序列。NOJ308-Substring

时间:2022-09-07 19:07:43

   求公共子序列的思路:

  假设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;
}