最长公共子串. java_最长公共子串的方法

在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

{

x=-1;

for(j=i;j

{

for(k=x+1;k

{

if(a[j]==b[k])

{

count++;

x=k;

break;

}

}

}

if(prev

{

prev=count;

}

count=0;

}

cout<

}

int main() {

string a,b;

int n;

cin>>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所以,一= 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到n c = d? C = A C = M + C = N? k从2到n d = d? count = count 1 //变为2 x被设置为3 k从3到n e = a?e = m?e = n? k从3到n f = 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 . 任何人都可以向我解释我在哪里弄错了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值