问题描述
我是这个平台的新手,请多多包涵。 我的程序基于最长的子字符串问题,使用动态编程时不会出现不匹配的情况。这是D-P解决方案的链接。
https://www.geeksforgeeks.org/longest-common-substring-dp-29/。
这里是原始问题的链接。
https://www.hackerrank.com/challenges/substring-diff/problem
我基本上使用了d-p解决方案中的表来存储两个子字符串中的不匹配数,而不是像原始问题中那样使用它来计算匹配数。对于表中所有小于或等于我存储的最大长度的值,并打印出来。
尽管我的解决方案适用于小型测试用例,但对于大型测试用例却给出了错误的答案。
这是我的c ++代码。
int substringDiff(int k,string s1,string s2) {
vector <vector<int>> v(s1.size()+1,vector<int>(s2.size()+1,0));
int len=0;
for(int i=1;i<=s1.size();i++)
{
for(int j=1;j<=s2.size();j++)
{
if(s1[i-1]==s2[j-1])
v[i][j]=v[i-1][j-1];
else
v[i][j]=v[i-1][j-1]+1;
if(v[i][j]<=k)
len=max(len,min(i,j));
}
}
return len;
}
我在网上搜索了一些更好的解决方案,但是我不明白为什么我的代码无法正常工作。请帮忙。
解决方法
当两个最长的公共子字符串都不是每个输入字符串的前缀时,您的程序将无法给出正确的答案。
例如,substringDiff(0,"xa","ya")
返回0
而预期1
。
这是因为只计算了两个字符串开头之间的差异数。
substringDiff(0,"ya")
的示例表:
y a
x 1 1
a 1 1
要使用此表获取正确答案,
- 设置长度以检查是否存在满足该长度的常见子字符串。
- 使用长度进行检查:可以通过使用表进行蛮力检查(
v[i][j] - v[i-length][j-length]
是以s1
的第i个字符和第j个字符结尾的子字符串的不匹配数s2
的字符) - 使用此检查,对符合通用子字符串的最大长度进行二进制搜索。