在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.任何人都可以向我解释我在哪里弄错了