最长公共子串的方法

 淡泊宁静1110 发布于 2023-02-08 19:54

在Common Child中的编程挑战中,我采用了与一般最长公共子串问题不同的方法.守则是

#include 
#include 
#include 
#include
#include 
#include 
using namespace std;

void max(string a,string b,int n)
{
    int count=0,x=-1,prev=0,i,j,k;
    for(i=0;i>a;
    cin>>b;
    n=a.length();
    max(a,b,n);
    return 0;

采用较小的TestCases我能够获得解决方案,但我无法获得更长的解决方案.

我做的是

输入:ABCDEF - 让它成为FBDAMN - 让它成为b,因为它被插入到代码中.输出:2.即.因为BD是子串.

所以我在这里做的是检查a的每个子字符串的匹配子字符串,并打印最大的子字符串.即.ABCDEF,BCDEF,CDEF,DEF,EF,F的子串,表示最外层的循环.(循环i)

现在,第二个循环匹配字符串中的每个字母即.它迭代(1 ... n),(2 ... n),(3 ... n),...,(n),意味着它从我指定的字母开始.

现在第三个循环遍历整个字符串B以查看[j]是否与B中的任何字母匹配,如果是,则计算增量.

因为我们只能删除从子信件,而不是把它打乱,即每个字母应该在这两个字符串,前面的字母被发现后,用x我正在寻找B中的相同的顺序.

干运行就像示例一样(从0到n-1的数组)

a = abcdef b = fbdamn

当i = 0时 - 整个字符串与abcdef匹配

x = -1所以k从0迭代到n-1所以,a = f?A = B?A = d?A = A?count = count + 1; 所以x设置为3(a的位置).在A中a之后的元素只能在a中出现,因此x = 3.因此k迭代从4到5 b = m?B = N + C = M + C = N?...... ......

现在我们保存先前计数的值,如果它大于之前的计数.所以maxcount = count然后重置count到0,并重置位置x = -1.

i = 1即string = BCDEF k从0到n所以,B = F?B =?count = count + 1 //变为1 x被设置为1(B的位置)k从2到nc = d?C = A C = M + C = N?k从2到nd = d?count = count + 1 //变为2 x被设置为2 k从3到ne = a?e = m?e = n?k从3到nf = a?f = m?f = n?然后,如果最大计数(代码中的prev)大于当前计数,则maxcount = count,reset count = 0,x = -1; 然后就像CDEF,DEF,EF,F这样,这里的最大子串变为2

适用于较短的测试用例,而不适用于较长的测试用例.

它适用的测试用例是:

OUDFRMYMAW AWHYFCCMQX

输出2

不起作用

WEWOUCUIDGCGTRMEZEPXZFEJWISRSBBSYXAYDFEJJDLEBVHHKS FDAGCXGKCTKWNECHMRXZWMLRYUCOCZHJRRJBOAJOQJZZVUYXIC

输出正确为15,输出为10.任何人都可以向我解释我在哪里弄错了

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有