diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md" index ef7008bc0556505ef9de220cc128d8ff726dcc41..42cf9b210dd622d34f0e02e2d579824d38dad631 100644 --- "a/problems/0028.\345\256\236\347\216\260strStr.md" +++ "b/problems/0028.\345\256\236\347\216\260strStr.md" @@ -199,13 +199,13 @@ next数组就是一个前缀表(prefix table)。 所以要看前一位的 前缀表的数值。 -前一个字符的前缀表的数值是2, 所有把下标移动到下标2的位置继续比配。 可以再反复看一下上面的动画。 +前一个字符的前缀表的数值是2, 所以把下标移动到下标2的位置继续匹配。 可以再反复看一下上面的动画。 最后就在文本串中找到了和模式串匹配的子串了。 # 前缀表与next数组 -很多KMP算法的时间都是使用next数组来做回退操作,那么next数组与前缀表有什么关系呢? +很多KMP算法的实现都是使用next数组来做回退操作,那么next数组与前缀表有什么关系呢? next数组就可以是前缀表,但是很多实现都是把前缀表统一减一(右移一位,初始位置为-1)之后作为next数组。 diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" index d2f7d84b922eb20f2eae2847aae385aa9c57db55..2bf0cdc49ebe6570575b1b3b54f0653f92733216 100644 --- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" +++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" @@ -125,6 +125,32 @@ class Solution { } ``` +```java +class Solution { + + //换了一种思路:先求出word1和word2的最大公共子序列长度len,然后(word1-len)+(word2-len)就是要删除的最少次数了 + public int minDistance(String word1, String word2) { + + int len1 = word1.length(); + int len2 = word2.length(); + + int[][] dp = new int[len1+1][len2+1]; + + + for(int i = 1; i <= len1; i++) { + for(int j = 1; j < len2; j++) { + if(word1.charAt(i-1) == word2.charAt(j-1)) { + dp[i][j] = dp[i-1][j-1] + 1; + }else { + dp[i][j] = Math.max(dp[i][j-1], dp[i-1][j]); + } + } + } + + return len1 + len2 - dp[len1][len2] * 2; + } +} +``` Python: ```python