zoukankan      html  css  js  c++  java
  • 倪文迪陪你学蓝桥杯2021寒假每日一题:1.8日(2017省赛A第6题)

    2021年寒假每日一题,2017~2019年的省赛真题。
    本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供。

    后面的每日一题,每题发一个新博文,请大家看博客目录https://blog.csdn.net/weixin_43914593
    @

    1、题目描述

      2017年蓝桥杯软件类省赛C++大学A组第6题“最大公共子串”。
      一道代码填空题,八成也是送分题。
      因为不难,罗老师就再做一次。


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

    比如:"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
    ", f("abcdkkk", "baabcdadabc"));
    	return 0;
    }
    

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


    2、题解

      又是一道常见DP,果然又是送分题。

      注意此题是“最大公共子串”,不是“最大公共子序列”。子序列和子串是不同的概念,子串的元素在原序列中是连续的,子序列不用连续。题目的例子中子串“abcd”是连续的字符。

      (a[][])就是状态转移矩阵。DP的状态转移矩阵一般写作(dp[][]),题目里写成(a[][])有那么一点点迷惑作用。
      状态(a[i][j])的含义是:以(s_1[i])(s_2[j])为结尾的两个子串(s_1[0]) ~(s_1[i])(s_2[0]) ~(s_2[j]),它们的公共子串的长度。
      遍历所有的(i、j),其中最大的(a[i][j])就是答案。
      状态如何转移?讨论两种情况:
      (1)若(s_1[i] != s_2[j]),那么(a[i][j]=0)
      (2)若(s_1[i]==s_2[j]),那么就看前一个字符是否相等,有(a[i][j] = a[i-1][j-1] + 1)
      其中(1)已经在memset把a[][]初始化为0时实现了。所以代码填空就是完成(2):

    	a[i][j] = a[i-1][j-1] + 1;
    

    3、扩展

      子串问题比子序列问题简单那么一丢丢,当然子序列问题也很简单。
      参考这篇博文,详细介绍了“最大公共子序列”:
      DP概述和常见DP面试题
    https://blog.csdn.net/weixin_43914593/article/details/105444090

  • 相关阅读:
    第三天 moyax
    mkfs.ext3 option
    write file to stroage trigger kernel warning
    download fomat install rootfs script
    custom usb-seriel udev relus for compatible usb-seriel devices using kermit
    Wifi Troughput Test using iperf
    learning uboot switch to standby system using button
    learning uboot support web http function in qca4531 cpu
    learngin uboot design parameter recovery mechanism
    learning uboot auto switch to stanbdy system in qca4531 cpu
  • 原文地址:https://www.cnblogs.com/luoyj/p/14271422.html
Copyright © 2011-2022 走看看