第八届蓝桥杯个人赛省赛(软件类)C++B组试题第六题

一【题目描述】


标题:最大公共子串

最大公共子串长度问题就是:
求两个串的所有子串中能够匹配上的最大长度是多少。

比如:"abcdkkk" 和 "baabcdadabc",
可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。

下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。

请分析该解法的思路,并补全划线部分缺失的代码。


#include <stdio.h>
#include <string.h>

#define N 256
int f(const char* s1, const char* s2)
{
    int a[N][N];
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int i,j;
    
    memset(a,0,sizeof(int)*N*N);
    int max = 0;
    for(i=1; i<=len1; i++){
        for(j=1; j<=len2; j++){
            if(s1[i-1]==s2[j-1]) {
                a[i][j] = __________________________;  //填空
                if(a[i][j] > max) max = a[i][j];
            }
        }
    }
    
    return max;
}

int main()
{
    printf("%d\n", f("abcdkkk", "baabcdadabc"));
    return 0;
}

注意:只提交缺少的代码,不要提交已有的代码和符号。也不要提交说明性文字。

二【解题思路】

     这还是一道程序填空题,标题是最大公共子串,这个可能大家就比较熟悉了。因为公共子串,公共子序列等一系列问题是很多的,它们都有很多的解决方法,矩阵、动态规划等等。那么对于填空题,我们还是认真的从已知的代码中寻求答案和思路。

     首先,题目已知是利用矩阵法求解的,这个时候可能我们脑子里面已经会有一个大概的印象:有一个二维的标记数组,然后进行表及判断,最后得到最大的数值。好的,我们来看程序是怎么运行的。

     我们从主函数看起,知道了它调用f函数,然后输出abcdkkk和baabcdadabc最大的子串,答案是abcd。那么我们来看看函数,传入两个字符串,定义一个数组,然后得到s1和s2的长度,初始化数组都为0,设置最大的子串长度为0,两个for循环进行判断,外层for循环是s1的长度,第二层是s2的长度,进行if语句的判断,如果相等,a[i][j]赋值为多少(这里填空),并且和最大值比较赋值。最后返回最大值的整数。

     我们日常的思路当然是如果当前比对的相等,那么我们就继续继续往下比,并且记住当前的最大子串个数,直到全部比对结束之后,返回记录的最大子串。而这里利用数组的话,就是如果当前比对的字符相等,那么a[i][j]数组应该等于前一个数组的值加上1(即a[i-1][j-1]+1),这样数组加一的操作就可以得到连续的序列个数。

三【解题步骤】

#include <stdio.h>
#include <string.h>

#define N 256
int f(const char* s1, const char* s2)
{
	int a[N][N];
	int len1 = strlen(s1);
	int len2 = strlen(s2);
	int i,j;
	
	memset(a,0,sizeof(int)*N*N);
	int max = 0;
	for(i=1; i<=len1; i++){
		for(j=1; j<=len2; j++){
			if(s1[i-1]==s2[j-1]) {
				a[i][j] = a[i-1][j-1]+1;  //填空
				if(a[i][j] > max) max = a[i][j];
			}
		}
	}
	
	return max;
}

int main()
{
	printf("%d\n", f("acb", "abcdadabc"));
	//printf("%d\n", f("abcdkkk", "baabcdadabc"));
	return 0;
}

答案:a[i][j] = a[i-1][j-1]+1;

四【总结】

     这个题目其实很好写出来,其实只要看过字符串匹配或者细心一点读题目都可以做出来。如有误,请指出,谢谢。

发布了123 篇原创文章 · 获赞 234 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43919400/article/details/105268621
今日推荐