zoukankan      html  css  js  c++  java
  • 02填空题

    题目描述:

    最大公共子串长度问题就是:

    求两个串的所有子串中能够匹配上的最大长度是多少。
    比如:"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;  
    }  
    

      

    题目答案:

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

    题目思路:

    动态规划的思想,a[i][j]表示到字符串s1的i位置和s2的j位置的最大公共子串的长度 ,数组初始化为0。为了方便理解,我们这么想,如果s1的字符串的第一个字符和s2的第一个字符相同,那么a[1][1] = 1;如果两个字符串的第二个字符和相同,那么,到第二个位置的最长公共子串就等于1+1 = 2,也就是到第一个字符的公共子串的个数+1。即a[i][j] = 1+ a[i-1][j-1]。因此,我们可以从第一个位置开始递推求出到任意一个位置的公共子串,在递推过程中记录最大的结果即可。

  • 相关阅读:
    【数学】三分法
    【数学】【背包】【NOIP2018】P5020 货币系统
    【数学】【CF27E】 Number With The Given Amount Of Divisors
    【单调队列】【P3957】 跳房子
    【极值问题】【CF33C】 Wonderful Randomized Sum
    【DP】【CF31E】 TV Game
    【神仙题】【CF28D】 Don't fear, DravDe is kind
    【线段树】【CF19D】 Points
    【字符串】KMP字符串匹配
    【二维树状数组】【CF10D】 LCIS
  • 原文地址:https://www.cnblogs.com/passion-sky/p/8516195.html
Copyright © 2011-2022 走看看