最长公共连续子串--全国模拟(二)

[编程题] 最长公共连续子串

时间限制:1秒

空间限制:32768K

牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度。

输入描述:

输入为两行字符串(可能包含空格),长度均小于等于50.

输出描述:

输出为一个整数,表示最长公共连续子串的长度。

输入例子:

abcde abgde

输出例子:

2

自己的解题思路:针对两个字符串,定义函数GetEqualCount来求得对于字符串long从L_start开始与字符串short比较得到的最长公共连续子串的长度

然后对于两个字符串,先对于a从0-length1位分别与b[0]对应求出最长公共连续子串的长度

例 abcde abc

abcde

abc

abcde

abc

abcde

abc

abcde

abc

abcde

abc

再对于b从0-length2分别与a[0]对应比一遍

abc

abcde

abc

abcde

abc

abcde

此时所有情况遍历到,max_count为所求,输出即可

 1 #include <iostream>
 2 using namespace std;
 3
 4 int GetEqualCount(string L,string S,int L_start,int L_len,int S_Len)
 5 {
 6     int count = 0;
 7     int max_count = 0;
 8     int j = 0;
 9     for(int i = L_start;i<L_len;i++)
10     {
11         if(j == S_Len)
12         {
13             max_count = max(max_count,count);
14             count=0;
15             break;
16         }
17         if(L[i] == S[j])
18         {
19             count++;
20             j++;
21         }
22         else
23         {
24             max_count = max(max_count,count);
25             count=0;
26             j++;
27         }
28     }
29     max_count = max(max_count,count);
30     return max_count;
31
32 }
33 int main()
34 {
35     string a;
36     string b;
37     getline(cin,a);
38     getline(cin,b);
39
40     int length1 = a.size();
41     int length2 = b.size();
42
43     int count = 0;
44     int max_count = 0;
45
46     for(int i=0;i<length1;i++)
47     {
48         count = GetEqualCount(a,b,i,length1,length2);
49         max_count = max(max_count,count);
50     }
51     for(int i=0;i<length2;i++)
52     {
53         count = GetEqualCount(b,a,i,length2,length1);
54         max_count = max(max_count,count);
55     }
56
57     cout<<max_count<<endl;
58
59     return 0;
60 }

参考网上,用空间换时间解题思路:
假设两个字符串str1和str2,长度分别为m和n,则构建一个m*n的矩阵matrix,   
matrix[i][j]==1表示字符串str1中第i个字符与str2中第j个字符相等,为0则不相等。
统计矩阵matrix中每条斜线上1的连续最大个数就是str1和str2中公共连续子串的最大长度
例如:str1: abcde    str2: abgde 
matrix = [ 1  0  0  0  0 
           0  1  0  0  0
           0  0  0  0  0
           0  0  0  1  0
           0  0  0  0  1 ]
斜线上连续的1的最大个数为2,所以最长公共连续子串长度为2

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     char str1[51];
 6     char str2[51];
 7     int leng, maxleng=0;
 8     cin.getline(str1,51);
 9     cin.getline(str2,51);
10     int matrix[50][50] = {0};//构建初始矩阵matrix
11     for(int i = 0;str1[i] != ‘\0‘;i++)
12     {
13         for(int j = 0; str2[j] != ‘\0‘; j++)
14         {
15             if(str1[i] == str2[j])
16                 matrix[i][j] = 1;//如果str1中第i个字符与str2中第j个字符相等,则为1
17         }
18     }
19     //循环统计每条斜线上的连续1的个数
20     for(int i = 0;str1[i] != ‘\0‘;i++)
21     {
22         for(int j = 0; str2[j]!= ‘\0‘; j++)
23         {
24             leng = 0;
25             int m = i;
26             int n = j;
27             while(matrix[m++][n++] == 1)//判断其右下角位置是否为1
28                 leng++;
29             if(maxleng < leng)
30                 maxleng = leng;
31         }
32     }
33     cout << maxleng;
34     return 0;
35 }
时间: 2024-11-14 12:09:43

最长公共连续子串--全国模拟(二)的相关文章

最长公共子序列 与 最长公共连续子串

最长公共子序列 //最长公共子序列(个数) #include<iostream> using namespace std; int c[100][100]={0}; int len1,len2; int gcd(string a,string b){ len1=a.length(); len2=b.length(); int tmp=-1; for(int i=0;i<len1;i++) { for(int j=0;j<len2;j++){ if(a[i]==a[j]) c[i][

BNUOJ 4215 最长公共连续子序列

最长公共连续子序列 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main 给你两个序列S1和S2,长度分别是L1,L2 (1 <= L1 , L2 <= 180). 写一个程序找出最长的连续公共子序列. 连续子序列定义为序列中连续的一个片段.例如序列"1 2 3"的子串有空串,"1","2",

最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr

问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj.例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列. 考虑最长公共子序列问题如何分解成子问题,设A=“a0,a1,…,am-1”,B=“b0,b1,…,bm

poj 3518 Corporate Identity 后缀数组-&gt;多字符串最长相同连续子串

题目链接 题意:输入N(2 <= N <= 4000)个长度不超过200的字符串,输出字典序最小的最长公共连续子串; 思路:将所有的字符串中间加上分隔符,注:分隔符只需要和输入的字符不同,且各自不同即可,没有必要是最小的字符; 连接后缀数组求解出height之后二分长度,由于height是根据sa数组建立的,所以前面符合的就是字典序最小的,直接找到就停止即可; ps: 把之前的模板简化了下,A题才是关键; #include<iostream> #include<cstdio&

最长公共子序列和最长公共子序列

最长公共子序列: 例如:abcfbc abfcb                答案是:4: 最长公共子串  :答案是: 2: 代码: 最长公共子序列: #include<cstdio> #include<cstring> #define max(x,y) (x>y?x:y) int len1,len2; int dp[1010][1010]; int bj[1010][1010]; char ch1[1010],ch2[1010]; void LCS() //lcs最长公共

最长公共子串和最长公共子序列

最长公共子串与最长公共子序列是有区别的.区别在于最长公共子串要求字符是连续的. 例如:str1:  abcd      str2:  abec那么最长公共子序列是:abc,长度为3最长公共子串是:ab,长度为2 1. 最长公共子序列 Largest common subsequence 最长公共子序列:用f[i][j]表示str1的前i个字符与str2的前j个字符的最长公共子序列的长度. int LCS(int a[],int b[],int len) { vector<int> f(len+

[codevs2185]最长公共上升子序列

试题描述 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们要研究最长公共上升子序列了.小沐沐说,对于两个串A,B,如果它们都包含一段位置不一定连续的数字,且数字是严格递增的,那么称这一段数字是两个串的公共上升子串,而所有的公共上升子串中最长的就是最长公共上升子串了.奶牛半懂不懂,小沐沐要你来告诉奶牛什么是最长公共上升子串.不过,只要告诉奶牛它的长度就可以了. 输入 第一行N,表示A,B的长度.第二行,串A.第三行,串B.

最长公共上升子序列(codevs 2185)

题目描述 Description 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们要研究最长公共上升子序列了. 小沐沐说,对于两个串A,B,如果它们都包含一段位置不一定连续的数字,且数字是严格递增的,那么称这一段数字是两个串的公共上升子串,而所有的公共上升子串中最长的就是最长公共上升子串了. 奶牛半懂不懂,小沐沐要你来告诉奶牛什么是最长公共上升子串.不过,只要告诉奶牛它的长度就可以了. 输入描述 Input Descri

【基础练习】【线性DP】codevs1408 最长公共子序列(上升)题解

</pre><p></p><p style="color:rgb(54,46,43); font-family:Arial; font-size:14px; line-height:26px"><span style="line-height:24px; text-indent:28px">这道题目捣鼓了一个小时了终于弄出来咯···怒吼三声:容易吗!文章被盗还是很严重,加版权信息转载请注明出处 [ameta