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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章