583. 两个字符串的删除操作 - 力扣(LeetCode)
- class Solution {
- public int minDistance(String s1, String s2) {
- char[] cs1 = s1.toCharArray(), cs2 = s2.toCharArray();
- int n = s1.length(), m = s2.length();
- int[][] f = new int[n + 1][m + 1];
- for (int i = 0; i <= n; i++) f[i][0] = i;
- for (int j = 0; j <= m; j++) f[0][j] = j;
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- f[i][j] = Math.min(f[i - 1][j] + 1, f[i][j - 1] + 1);
- if (cs1[i - 1] == cs2[j - 1]) f[i][j] = Math.min(f[i][j], f[i - 1][j - 1]);
- }
- }
- return f[n][m];
- }
- }
-
- class Solution {
- public int minDistance(String word1, String word2) {
- int n = word1.length();
- int m = word2.length();
-
- // 有一个字符串为空串
- if (n * m == 0) {
- return n + m;
- }
-
- // DP 数组
- int[][] D = new int[n + 1][m + 1];
-
- // 边界状态初始化
- for (int i = 0; i < n + 1; i++) {
- D[i][0] = i;
- }
- for (int j = 0; j < m + 1; j++) {
- D[0][j] = j;
- }
-
- // 计算所有 DP 值
- for (int i = 1; i < n + 1; i++) {
- for (int j = 1; j < m + 1; j++) {
- int left = D[i - 1][j] + 1;
- int down = D[i][j - 1] + 1;
- int left_down = D[i - 1][j - 1];
- if (word1.charAt(i - 1) != word2.charAt(j - 1)) {
- left_down += 1;
- }
- D[i][j] = Math.min(left, Math.min(down, left_down));
- }
- }
- return D[n][m];
- }
- }
-