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

本文介绍了如何通过构建矩阵来解决最长连续公共字串问题,包括初始化矩阵、填充矩阵及找到最大长度的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

在说一遍 关于最长连续公共字串的算法,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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值