String 为什么这需要动态规划?

String 为什么这需要动态规划?,string,algorithm,dynamic-programming,sequences,String,Algorithm,Dynamic Programming,Sequences,可以找到问题陈述,它说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++){

可以找到问题陈述,它说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);
字符串str1、str2;
str1=“OldSite:geeksforgeks.org”;
str2=“NewSite:geeksquick.com”;
int i,j,k;
整数计数,当前最大值=0;
对于(i=0;i当前最大值)
currentMax=计数;
继续;
}
如果(计数>当前最大值)
currentMax=计数;
}
系统输出打印项次(当前最大值);
即使我的解决方案也需要O(m*n),但我似乎没有按照DP的方式来做

我所做的是检查string1中的每个字符,string2中可用的最大长度是多少

基本上我认为这是蛮力方法

我的解决方案有问题吗

编辑如评论部分所述

进行更改以生成正确的结果将内部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;
}
for(j=0;j当前最大值){
currentMax=计数;
计数=0;
k=i;
}
否则{
计数=0;
k=i;
}
继续;
}
编辑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;
        }
for(j=0;j当前最大值){
currentMax=计数;
计数=0;
k=i;
if(str1.字符(k)=str2.字符(j)){
计数++;
k++;
}
}
否则{
计数=0;
k=i;
if(str1.字符(k)=str2.字符(j)){
计数++;
k++;
}
}
继续;
}

我认为您为最长的公共子字符串编写的代码无效。请尝试输入:-

str1 = "swring";
str2 = "skwkring";
这里最长的常用子字符串是“ring”,它是4个字符,但您的代码给出了“6”的答案。这里我认为您的代码只是计算字符串中的公共字符,它是“swring”,所以结果是6

O(n*m)中使用蛮力无法解决这个问题,尽管使用DP似乎很明显

编辑:-

str1 = "sbsringada";
str2 = "cdssringasd";
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);
您编辑的解决方案涵盖了更多的问题,但对于中心位置的字符串仍然不是完美的,原因与贪婪不同于DP

检查:-

str1 = "sbsringada";
str2 = "cdssringasd";
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);
正确的ans是
6
,也就是
“sringa”
,但代码输出
5
。原因是它在str2中的“sringa”之前的“s”处变得贪婪

编辑:-

str1 = "sbsringada";
str2 = "cdssringasd";
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);
这将永远持续下去,你将给出一个代码,我将给出它不起作用的地方,除非你没有找到真正的野蛮算法或证明你的代码在数学上是正确的

由于您还没有证明,我将给您实际的暴力代码,我曾经为同一个问题编写过。理解起来非常简单直观,但效率很低

伪代码:-

str1 = "sbsringada";
str2 = "cdssringasd";
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);
int max=0;

对于(int i=0;你发布的链接说这个问题可以用后缀树来解决,所以不需要DP。但是你可以直观地看到,使用上面的方法O(mn)是可能的(尽管我可能搞砸了一些作业)。如果我一次从字符串1中提取一个字符,然后查看字符串2中子字符串的最大长度是多少,然后取字符串1中所有字符的最大长度。现在,检查字符串1中某个字符的最大子字符串的复杂性是字符串2的大小。因此,对于字符串1中的m个字符,它将是字符串2的msize。我认为是y你把这个问题搞混了。@GeoAoe不是我没有看到我的例子