为什么需要动态编程呢?

时间:2014-06-12 10:08:00

标签: string algorithm dynamic-programming sequences

可以找到问题陈述here.它表示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);

即使我的解决方案需要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;
}

编辑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;
        }

1 个答案:

答案 0 :(得分:5)

我认为最长公共子串的代码不起作用尝试输入: -

str1 = "swring";
str2 = "skwkring";

这里最长的公共子串是&#34; ring&#34;这是4个字符,但你的代码给出了&#34; 6&#34;回答。在这里,我认为你的代码只是计算字符串中的常见字符,即&#34; swring&#34;所以结果是6.

你无法在 O(n * m)中使用蛮力来解决这个问题,尽管看起来很明显,所以使用了DP。

修改: -

您编辑的解决方案涵盖了更多问题,但仍然不适合中心定位的字符串,原因与 DP

贪婪 贪婪相同

检查: -

str1 = "sbsringada";
str2 = "cdssringasd";

正确的ans是6 "sringa",但代码输出5。原因是&#34; s&#34; 贪婪在str2中"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);

此代码的时间复杂度为O(m*n*min(m,n))

为了取得进一步的进展,您需要证明您的代码与此类似,就像DP的情况一样,通过归纳证明了这一点。