Java 编辑大型字符串的距离解决方案

Java 编辑大型字符串的距离解决方案,java,dynamic-programming,edit-distance,Java,Dynamic Programming,Edit Distance,我正在努力解决这个问题。下面是我一直在使用的代码 public static int minDistance(String word1, String word2) { int len1 = word1.length(); int len2 = word2.length(); // len1+1, len2+1, because finally return dp[len1][len2] int[][] dp = new int[len1 + 1][len2

我正在努力解决这个问题。下面是我一直在使用的代码

 public static int minDistance(String word1, String word2) {
    int len1 = word1.length();
    int len2 = word2.length();

    // len1+1, len2+1, because finally return dp[len1][len2]
    int[][] dp = new int[len1 + 1][len2 + 1];

    for (int i = 0; i <= len1; i++) {
        dp[i][0] = i;
    }

    for (int j = 0; j <= len2; j++) {
        dp[0][j] = j;
    }

    //iterate though, and check last char
    for (int i = 0; i < len1; i++) {
        char c1 = word1.charAt(i);
        for (int j = 0; j < len2; j++) {
            char c2 = word2.charAt(j);

            //if last two chars equal
            if (c1 == c2) {
                //update dp value for +1 length
                dp[i + 1][j + 1] = dp[i][j];
            } else {
                int replace = dp[i][j] + 1 ;
                int insert = dp[i][j + 1] + 1  ;
                int delete = dp[i + 1][j] + 1 ;


                int min = replace > insert ? insert : replace;
                min = delete > min ? min : delete;
                dp[i + 1][j + 1] = min;
            }
        }
    }

    return dp[len1][len2];
}
以上内容将被删除

int[][] dp = new int[100000][100000];
因此,它将给出一个stackOverflow错误

所以上面的程序只适用于小长度字符串。
我想问的是,有没有办法在java中有效地解决大字符串(长度>100000)的这个问题

首先,在Java中分配100k x 100k int数组没有问题,您只需在堆中而不是堆栈中进行分配(在一台内存约为80GB的机器上:)

第二,作为(非常直接的)提示:

请注意,在循环中,一次只能使用两行—行
i
和行
i+1
。事实上,您可以从行
i
计算行
i+1
。一旦获得
i+1
,就不再需要存储行
i

这个巧妙的技巧允许您同时只存储2行,将空间复杂度从
n^2
降低到
n
。既然你说这不是家庭作业(即使你的个人资料显示你是一名CS本科生…),我相信你会自己编写代码


回想起来,我记得我在攻读CS学位时遇到了这个问题…

为什么输入这么长?也许多了解一点情况会让我们提出更好的选择。当我们想要比较长度超过100000的两个字符串时。在这种情况下,我们无法创建java 2D数组。@jurgemaister:我添加了一些详细信息。这不是一个家庭作业:)你链接的维基页面引用了Ukkonen的优化,这应该足够了。你可以去看看更多的主意,我知道你的主意了。谢谢你的回答。顺便说一句,我正在为一个编程比赛练习DP。我几乎在所有的参考文献中都发现了这个问题。但当我尝试比较大字符串时,它失败了。因为以上原因。(在正常的比赛中,我们不能分配超过256MB的内存)所以我把这个问题贴在这里以得到提示。再次感谢。我来检查一下。@prime然后忽略那些不那么微妙的评论。这将使内存需求大大低于最大值。
int[][] dp = new int[100000][100000];