Kra*_*ken -1 string algorithm sequences dynamic-programming
问题陈述可以在这里找到.它说DP解决方案需要O(m*n)时间.但为什么我们需要DP呢?我写了以下解决方案,但不确定是否需要DP.
String str1,str2;
str1 = "OldSite:GeeksforGeeks.org";
str2 = "NewSite:GeeksQuiz.com";
int i,j,k;
int count,currentMax =0;
for(i = 0; i < str1.length();i++){
count = 0;
k = i;
for(j = 0; j < str2.length() && k < str1.length();j++){
if(str1.charAt(k) == str2.charAt(j)){
count++;
k++;
}
else if(count > currentMax)
currentMax = count;
continue;
}
if(count > currentMax)
currentMax = count;
}
System.out.println(currentMax);
Run Code Online (Sandbox Code Playgroud)
即使我的解决方案需要O(m*n),但我似乎没有采用DP方式.
我所做的是检查string1中的每个字符,字符串2中可用的最大长度是多少.
基本上我认为这是蛮力方法.
我的解决方案有什么问题吗?
编辑在评论部分提到.
进行更改以产生正确的结果,将内部for循环更改为
for(j = 0; j < str2.length() && k < str1.length();j++){
if(str1.charAt(k) == str2.charAt(j)){
count++;
k++;
}
else if(count > currentMax){
currentMax = count;
count = 0;
k=i;
}
else{
count = 0;
k=i;
}
continue;
}
Run Code Online (Sandbox Code Playgroud)
编辑2评论.
for(j = 0; j < str2.length() && k < str1.length();j++){
if(str1.charAt(k) == str2.charAt(j)){
count++;
k++;
}
else if(count > currentMax){
currentMax = count;
count = 0;
k=i;
if(str1.charAt(k) == str2.charAt(j)){
count++;
k++;
}
}
else{
count = 0;
k=i;
if(str1.charAt(k) == str2.charAt(j)){
count++;
k++;
}
}
continue;
}
Run Code Online (Sandbox Code Playgroud)
我认为你的代码最长的常见子串是不工作尝试输入: -
str1 = "swring";
str2 = "skwkring";
Run Code Online (Sandbox Code Playgroud)
这里最长的公共子串是"ring",它是4个字符,但是你的代码给出了"6"的答案.在这里,我认为你的代码只是计算字符串中的常见字符"swring",因此结果为6.
你不能用O(n*m)中的强力来解决这个问题,尽管看起来很明显,所以使用了DP.
编辑: -
您编辑的解决方案涵盖了更多问题,但仍然不适合集中定位的字符串,原因与DP不同,它是贪婪的
检查: -
str1 = "sbsringada";
str2 = "cdssringasd";
Run Code Online (Sandbox Code Playgroud)
正确的答案是6,"sringa"但代码输出5.原因是它在str2 之前在"s" 变得贪婪"sringa".
编辑:-
除非你没有找到实际的暴力算法或证明你的代码在数学上是正确的,否则这将永远继续你将给出一个代码我会给你的代码.
由于你还没有证明,我会给你一个我曾经为同样的问题写过的实际蛮力代码.理解起来非常简单直观,但效率非常低.
伪代码: -
int max = 0;
for(int i=0;i<str1.length,i++) {
for(int j=0;j<str2.length;j++) {
int k = 0;
for(;j+k<str2.length && i+k < str1.length ;k++) {
if(str1[i+k]!=str[j+k])
break;
}
if(k>max)
max = k;
}
}
print(max);
Run Code Online (Sandbox Code Playgroud)
这段代码的时间复杂度 O(m*n*min(m,n))
为了取得进一步的进展,您需要证明您的代码与此类似,就像DP的情况一样,通过归纳证明了这一点.