最大字符串匹配长度算法

题目描述:

Description

现在给定两条字符串,如“abcdabc”和"abc",要求字符串"abc"在"abcdabc"的最大字符串长度。最大字符串长度指的是"abc"在"abcdabc"连续出现的长度,当匹配的次数大于等于1的时候,不要求"abc"在后面也要保持完整。如"abcab"和“abc”的最大字符串长度为5。
字符串长度不大于10000。

Input

输入的第一个数字 N 代表测试样例数目,接下来有 2∗N 行字符串。
每两行字符串的第一个字符串为待匹配的字符串,第二个字符串为要匹配的字符串。

Output

题意要求的最大字符串匹配长度。

Sample Input
2
abcdabc
abc
abcdabcd
abcd
Sample Output
3
8

算法

思路:

有几个注意点:

getchar用来清除缓冲区中的回车符

必须要有一次完整的str2在str1中后才可以统计残缺的字符,否则都记为0

比如:

str1:abcdef 

str2:cdefg

记为0,因为str1中没有一次完整的str2,就算有cdef也不计数

还要最重要的一点:

若有两个相邻的str2[0],那么要判断从第二个开始计数(详见代码注释)

代码实现:
# include
# include

int main(){
    int n;
    scanf("%d",&n); 
    getchar();//除掉缓冲区中的回车符
    char str1[10000],str2[10000];
    int cnt=0,j=0,temp=n;//temp存储n的值,因为之后n会改变
    int arr[10000]={0};//全部初始化为0,便于操作
    while(n--){//但n减到0则退出循环
        cnt=0;j=0;
        gets(str1);gets(str2);
        int len1=strlen(str1),len2=strlen(str2);
        //筛除不合理的数据
        if(len2>len1){
            arr[n]=0;
            continue;
        }
        int index = strstr(str1,str2)-str1+len2;//第一个完整匹配的字符串的尾下标
        if(index<=len1&&index>=0){
            cnt=len2;
            int ret = 0;
            while(index=0;i--) printf("%d\n",arr[i]);
    return 0;
}

你可能感兴趣的:(算法,开发语言,算法)