noj 308 Substring (第四届河南省程序设计大赛)

实际上是求最长公共字串的,只不过它的表达让人有点儿那啥……

在说一遍 关于最长连续公共字串的算法,str1   str2 将str1 作为竖行,str2 作为横行,这样形成一个矩阵 map[l1][l2],先将map[0][i] 与 map[i][0]赋值,从i=1 j=1开始如果str1[i]==str2[j] 则map[i][j]=map[i-1][j-1]+1求最大的那个就是最长的公共字串长度,这道题是让求公共字串,我们记住最大的那个数的位置在向上遍历即可

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define max(a,b) (a)>(b)? (a):(b)
char a[55],b[55];
int map[55][55];
int l;
int main()
{
 int i,j,n;
 int max;
 int flag;
 cin>>n;
 while(n--)
 {
  cin>>a;
  memset(map,0,sizeof(map));
  l=strlen(a);
  j=0;
  for(i=l-1;i>=0;i--)
  {
   b[j]=a[i];
   j++;
  }
  for(i=0;i<l;i++)
  {
   if(a[0]==b[i])
    map[0][i]=1;
   if(b[0]==a[i])
    map[i][0]=1;
  }
  max=1;
  flag=0;
  for(i=1;i<l;i++)
   for(j=1;j<l;j++)
   {
    if(a[i]==b[j])
        map[i][j]=map[i-1][j-1]+1;
    if(max<map[i][j])
    {
     max=map[i][j];
     flag=i;
    }
   }
  for(i=flag-max+1;i<=flag;i++)
   cout<<a[i];
  cout<<endl;
 }
 return 0;
}

你可能感兴趣的:(算法)