【发布时间】:2013-12-20 16:50:04
【问题描述】:
在Common Child 的编程挑战赛中,我采用了与一般最长公共子串问题不同的方法。代码是
#include <cmath>
#include <cstdio>
#include <vector>
#include<string>
#include <iostream>
#include <algorithm>
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<n;i++)
{
x=-1;
for(j=i;j<n;j++)
{
for(k=x+1;k<n;k++)
{
if(a[j]==b[k])
{
count++;
x=k;
break;
}
}
}
if(prev<count)
{
prev=count;
}
count=0;
}
cout<<prev;
}
int main() {
string a,b;
int n;
cin>>a;
cin>>b;
n=a.length();
max(a,b,n);
return 0;
采用较小的测试用例我能够获得解决方案,但我无法获得更长的解决方案。
我做的是
输入:ABCDEF - 让它成为 FBDAMN - 让它成为 b,因为它被插入 编码。输出:2。即。 BD 是子字符串。
所以我在这里做的是检查每个的可匹配子字符串 a 的子串,并打印最大的。 IE。 ABCDEF 的子字符串, BCDEF,CDEF,DEF,EF,F 这里表示最外层的循环。(loop i)
现在第二个循环匹配字符串中的每个字母,即。它迭代 for (1...n),(2...n),(3...n),...,(n),表示从字母开始 我指定。
现在第三个循环遍历整个字符串 B 看是否 a[j] 匹配 B 中的任何字母,如果是则 count 递增。
由于我们只能从子字符串中删除字母而不能将其弄乱, 即每个字母在两者中都应具有相同的相对顺序 字符串,我在找到上一个字母后搜索 B,使用 x.
试运行就像示例(从 0 到 n-1 的数组)
a= abcdef b= fbdamn
当 i=0 - 整个字符串匹配 abcdef
x=-1 所以 k 从 0 迭代到 n-1 所以,a=f? a=b? a=d?一个=一个?计数 = 计数+1;所以x设置为3(a的位置)。 A中a之后的元素可以 仅出现在 B 中的 a 之后,因此 x=3。因此 k 从 4 迭代到 5 b=m? b=n? c=m?c=n? .... ... ...
现在我们保存先前计数的值,如果它大于计数 前。所以 maxcount=count 然后将 count 重置为 0,然后重置 位置 x=-1。
i=1 即字符串 = BCDEF k 从 0 到 n 所以,B=F? b=b?计数=计数+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 设置为 2 k 从 3 到 n e=a?e=m?e=n? k 从 3 到 n f=a?f=m?f=n?那么如果最大计数(prev in 代码)大于当前计数,则 maxcount = count,重置 count = 0,x=-1;然后对于 CDEF,DEF,EF,F 的最大子字符串是这样的 这里变成了 2
适用于较短的测试用例,但不适用于较长的测试用例。
它适用的测试用例是:
OUDFRMYMAW AWHYFCCMQX
带输出 2
不适合
WEWOUCUIDGCGTRMEZEPXZFEJWISRSBBSYXAYDFEJJDLEBVHHKS FDAGCXGKCTKWNECHMRXZWMLRYUCOCZHJRRJBOAJOQJZZVUYXIC
正确的输出是 15 而我的输出是 10。任何人都可以向我解释我在哪里犯了错误
【问题讨论】:
-
我不明白这个问题的最后投票:问题是完整的,并且非常有意义。
标签: c++ string algorithm lcs longest-substring