From d98a926995c24eab0d8ef28f7d7034e86255aad0 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Sat, 18 Jan 2025 17:52:07 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.0583 (#3968) No.0583.Delete Operation for Two Strings --- .../README.md | 142 ++++++++++------- .../README_EN.md | 144 +++++++++++------- .../Solution.cpp | 27 ++-- .../Solution.go | 23 +-- .../Solution.java | 22 +-- .../Solution.py | 18 +-- .../Solution.rs | 29 ++-- .../Solution.ts | 19 ++- 8 files changed, 258 insertions(+), 166 deletions(-) diff --git a/solution/0500-0599/0583.Delete Operation for Two Strings/README.md b/solution/0500-0599/0583.Delete Operation for Two Strings/README.md index c54ea51fb9191..0aa3d441ec76a 100644 --- a/solution/0500-0599/0583.Delete Operation for Two Strings/README.md +++ b/solution/0500-0599/0583.Delete Operation for Two Strings/README.md @@ -56,11 +56,15 @@ tags: ### 方法一:动态规划 -类似[1143. 最长公共子序列](https://github.com/doocs/leetcode/blob/main/solution/1100-1199/1143.Longest%20Common%20Subsequence/README.md)。 +我们定义 $f[i][j]$ 表示使得字符串 $\textit{word1}$ 的前 $i$ 个字符和字符串 $\textit{word2}$ 的前 $j$ 个字符相同的最小删除步数。那么答案为 $f[m][n]$,其中 $m$ 和 $n$ 分别是字符串 $\textit{word1}$ 和 $\textit{word2}$ 的长度。 -定义 `dp[i][j]` 表示使得 `word1[0:i-1]` 和 `word1[0:j-1]` 两个字符串相同所需执行的删除操作次数。 +初始时,如果 $j = 0$,那么 $f[i][0] = i$;如果 $i = 0$,那么 $f[0][j] = j$。 -时间复杂度:$O(mn)$。 +当 $i, j > 0$ 时,如果 $\textit{word1}[i - 1] = \textit{word2}[j - 1]$,那么 $f[i][j] = f[i - 1][j - 1]$;否则 $f[i][j] = \min(f[i - 1][j], f[i][j - 1]) + 1$。 + +最终返回 $f[m][n]$ 即可。 + +时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是字符串 $\textit{word1}$ 和 $\textit{word2}$ 的长度。 @@ -70,18 +74,18 @@ tags: class Solution: def minDistance(self, word1: str, word2: str) -> int: m, n = len(word1), len(word2) - dp = [[0] * (n + 1) for _ in range(m + 1)] + f = [[0] * (n + 1) for _ in range(m + 1)] for i in range(1, m + 1): - dp[i][0] = i + f[i][0] = i for j in range(1, n + 1): - dp[0][j] = j - for i in range(1, m + 1): - for j in range(1, n + 1): - if word1[i - 1] == word2[j - 1]: - dp[i][j] = dp[i - 1][j - 1] + f[0][j] = j + for i, a in enumerate(word1, 1): + for j, b in enumerate(word2, 1): + if a == b: + f[i][j] = f[i - 1][j - 1] else: - dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1]) - return dp[-1][-1] + f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1 + return f[m][n] ``` #### Java @@ -90,23 +94,25 @@ class Solution: class Solution { public int minDistance(String word1, String word2) { int m = word1.length(), n = word2.length(); - int[][] dp = new int[m + 1][n + 1]; - for (int i = 1; i <= m; ++i) { - dp[i][0] = i; + int[][] f = new int[m + 1][n + 1]; + for (int i = 0; i <= m; ++i) { + f[i][0] = i; } - for (int j = 1; j <= n; ++j) { - dp[0][j] = j; + for (int j = 0; j <= n; ++j) { + f[0][j] = j; } for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { - if (word1.charAt(i - 1) == word2.charAt(j - 1)) { - dp[i][j] = dp[i - 1][j - 1]; + char a = word1.charAt(i - 1); + char b = word2.charAt(j - 1); + if (a == b) { + f[i][j] = f[i - 1][j - 1]; } else { - dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1]); + f[i][j] = Math.min(f[i - 1][j], f[i][j - 1]) + 1; } } } - return dp[m][n]; + return f[m][n]; } } ``` @@ -117,19 +123,26 @@ class Solution { class Solution { public: int minDistance(string word1, string word2) { - int m = word1.size(), n = word2.size(); - vector> dp(m + 1, vector(n + 1)); - for (int i = 1; i <= m; ++i) dp[i][0] = i; - for (int j = 1; j <= n; ++j) dp[0][j] = j; + int m = word1.length(), n = word2.length(); + vector> f(m + 1, vector(n + 1)); + for (int i = 0; i <= m; ++i) { + f[i][0] = i; + } + for (int j = 0; j <= n; ++j) { + f[0][j] = j; + } for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { - if (word1[i - 1] == word2[j - 1]) - dp[i][j] = dp[i - 1][j - 1]; - else - dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1]); + char a = word1[i - 1]; + char b = word2[j - 1]; + if (a == b) { + f[i][j] = f[i - 1][j - 1]; + } else { + f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1; + } } } - return dp[m][n]; + return f[m][n]; } }; ``` @@ -139,24 +152,25 @@ public: ```go func minDistance(word1 string, word2 string) int { m, n := len(word1), len(word2) - dp := make([][]int, m+1) - for i := range dp { - dp[i] = make([]int, n+1) - dp[i][0] = i + f := make([][]int, m+1) + for i := range f { + f[i] = make([]int, n+1) + f[i][0] = i } - for j := range dp[0] { - dp[0][j] = j + for j := 1; j <= n; j++ { + f[0][j] = j } for i := 1; i <= m; i++ { for j := 1; j <= n; j++ { - if word1[i-1] == word2[j-1] { - dp[i][j] = dp[i-1][j-1] + a, b := word1[i-1], word2[j-1] + if a == b { + f[i][j] = f[i-1][j-1] } else { - dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1]) + f[i][j] = 1 + min(f[i-1][j], f[i][j-1]) } } } - return dp[m][n] + return f[m][n] } ``` @@ -166,18 +180,23 @@ func minDistance(word1 string, word2 string) int { function minDistance(word1: string, word2: string): number { const m = word1.length; const n = word2.length; - const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0)); - for (let i = 1; i <= m; i++) { - for (let j = 1; j <= n; j++) { + const f: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0)); + for (let i = 1; i <= m; ++i) { + f[i][0] = i; + } + for (let j = 1; j <= n; ++j) { + f[0][j] = j; + } + for (let i = 1; i <= m; ++i) { + for (let j = 1; j <= n; ++j) { if (word1[i - 1] === word2[j - 1]) { - dp[i][j] = dp[i - 1][j - 1] + 1; + f[i][j] = f[i - 1][j - 1]; } else { - dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + f[i][j] = Math.min(f[i - 1][j], f[i][j - 1]) + 1; } } } - const max = dp[m][n]; - return m - max + n - max; + return f[m][n]; } ``` @@ -186,20 +205,31 @@ function minDistance(word1: string, word2: string): number { ```rust impl Solution { pub fn min_distance(word1: String, word2: String) -> i32 { - let (m, n) = (word1.len(), word2.len()); - let (word1, word2) = (word1.as_bytes(), word2.as_bytes()); - let mut dp = vec![vec![0; n + 1]; m + 1]; + let m = word1.len(); + let n = word2.len(); + let s: Vec = word1.chars().collect(); + let t: Vec = word2.chars().collect(); + let mut f = vec![vec![0; n + 1]; m + 1]; + + for i in 0..=m { + f[i][0] = i as i32; + } + for j in 0..=n { + f[0][j] = j as i32; + } + for i in 1..=m { for j in 1..=n { - dp[i][j] = if word1[i - 1] == word2[j - 1] { - dp[i - 1][j - 1] + 1 + let a = s[i - 1]; + let b = t[j - 1]; + if a == b { + f[i][j] = f[i - 1][j - 1]; } else { - dp[i - 1][j].max(dp[i][j - 1]) - }; + f[i][j] = std::cmp::min(f[i - 1][j], f[i][j - 1]) + 1; + } } } - let max = dp[m][n]; - (m - max + (n - max)) as i32 + f[m][n] } } ``` diff --git a/solution/0500-0599/0583.Delete Operation for Two Strings/README_EN.md b/solution/0500-0599/0583.Delete Operation for Two Strings/README_EN.md index 7cab7574fb2eb..8172eb4cdb258 100644 --- a/solution/0500-0599/0583.Delete Operation for Two Strings/README_EN.md +++ b/solution/0500-0599/0583.Delete Operation for Two Strings/README_EN.md @@ -51,7 +51,17 @@ tags: -### Solution 1 +### Solution 1: Dynamic Programming + +We define $f[i][j]$ as the minimum number of deletions required to make the first $i$ characters of the string $\textit{word1}$ and the first $j$ characters of the string $\textit{word2}$ the same. The answer is $f[m][n]$, where $m$ and $n$ are the lengths of the strings $\textit{word1}$ and $\textit{word2}$, respectively. + +Initially, if $j = 0$, then $f[i][0] = i$; if $i = 0$, then $f[0][j] = j$. + +When $i, j > 0$, if $\textit{word1}[i - 1] = \textit{word2}[j - 1]$, then $f[i][j] = f[i - 1][j - 1]$; otherwise, $f[i][j] = \min(f[i - 1][j], f[i][j - 1]) + 1$. + +Finally, return $f[m][n]$. + +The time complexity is $O(m \times n)$, and the space complexity is $O(m \times n)$. Here, $m$ and $n$ are the lengths of the strings $\textit{word1}$ and $\textit{word2}$, respectively. @@ -61,18 +71,18 @@ tags: class Solution: def minDistance(self, word1: str, word2: str) -> int: m, n = len(word1), len(word2) - dp = [[0] * (n + 1) for _ in range(m + 1)] + f = [[0] * (n + 1) for _ in range(m + 1)] for i in range(1, m + 1): - dp[i][0] = i + f[i][0] = i for j in range(1, n + 1): - dp[0][j] = j - for i in range(1, m + 1): - for j in range(1, n + 1): - if word1[i - 1] == word2[j - 1]: - dp[i][j] = dp[i - 1][j - 1] + f[0][j] = j + for i, a in enumerate(word1, 1): + for j, b in enumerate(word2, 1): + if a == b: + f[i][j] = f[i - 1][j - 1] else: - dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1]) - return dp[-1][-1] + f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1 + return f[m][n] ``` #### Java @@ -81,23 +91,25 @@ class Solution: class Solution { public int minDistance(String word1, String word2) { int m = word1.length(), n = word2.length(); - int[][] dp = new int[m + 1][n + 1]; - for (int i = 1; i <= m; ++i) { - dp[i][0] = i; + int[][] f = new int[m + 1][n + 1]; + for (int i = 0; i <= m; ++i) { + f[i][0] = i; } - for (int j = 1; j <= n; ++j) { - dp[0][j] = j; + for (int j = 0; j <= n; ++j) { + f[0][j] = j; } for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { - if (word1.charAt(i - 1) == word2.charAt(j - 1)) { - dp[i][j] = dp[i - 1][j - 1]; + char a = word1.charAt(i - 1); + char b = word2.charAt(j - 1); + if (a == b) { + f[i][j] = f[i - 1][j - 1]; } else { - dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1]); + f[i][j] = Math.min(f[i - 1][j], f[i][j - 1]) + 1; } } } - return dp[m][n]; + return f[m][n]; } } ``` @@ -108,19 +120,26 @@ class Solution { class Solution { public: int minDistance(string word1, string word2) { - int m = word1.size(), n = word2.size(); - vector> dp(m + 1, vector(n + 1)); - for (int i = 1; i <= m; ++i) dp[i][0] = i; - for (int j = 1; j <= n; ++j) dp[0][j] = j; + int m = word1.length(), n = word2.length(); + vector> f(m + 1, vector(n + 1)); + for (int i = 0; i <= m; ++i) { + f[i][0] = i; + } + for (int j = 0; j <= n; ++j) { + f[0][j] = j; + } for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { - if (word1[i - 1] == word2[j - 1]) - dp[i][j] = dp[i - 1][j - 1]; - else - dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1]); + char a = word1[i - 1]; + char b = word2[j - 1]; + if (a == b) { + f[i][j] = f[i - 1][j - 1]; + } else { + f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1; + } } } - return dp[m][n]; + return f[m][n]; } }; ``` @@ -130,24 +149,25 @@ public: ```go func minDistance(word1 string, word2 string) int { m, n := len(word1), len(word2) - dp := make([][]int, m+1) - for i := range dp { - dp[i] = make([]int, n+1) - dp[i][0] = i + f := make([][]int, m+1) + for i := range f { + f[i] = make([]int, n+1) + f[i][0] = i } - for j := range dp[0] { - dp[0][j] = j + for j := 1; j <= n; j++ { + f[0][j] = j } for i := 1; i <= m; i++ { for j := 1; j <= n; j++ { - if word1[i-1] == word2[j-1] { - dp[i][j] = dp[i-1][j-1] + a, b := word1[i-1], word2[j-1] + if a == b { + f[i][j] = f[i-1][j-1] } else { - dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1]) + f[i][j] = 1 + min(f[i-1][j], f[i][j-1]) } } } - return dp[m][n] + return f[m][n] } ``` @@ -157,18 +177,23 @@ func minDistance(word1 string, word2 string) int { function minDistance(word1: string, word2: string): number { const m = word1.length; const n = word2.length; - const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0)); - for (let i = 1; i <= m; i++) { - for (let j = 1; j <= n; j++) { + const f: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0)); + for (let i = 1; i <= m; ++i) { + f[i][0] = i; + } + for (let j = 1; j <= n; ++j) { + f[0][j] = j; + } + for (let i = 1; i <= m; ++i) { + for (let j = 1; j <= n; ++j) { if (word1[i - 1] === word2[j - 1]) { - dp[i][j] = dp[i - 1][j - 1] + 1; + f[i][j] = f[i - 1][j - 1]; } else { - dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + f[i][j] = Math.min(f[i - 1][j], f[i][j - 1]) + 1; } } } - const max = dp[m][n]; - return m - max + n - max; + return f[m][n]; } ``` @@ -177,20 +202,31 @@ function minDistance(word1: string, word2: string): number { ```rust impl Solution { pub fn min_distance(word1: String, word2: String) -> i32 { - let (m, n) = (word1.len(), word2.len()); - let (word1, word2) = (word1.as_bytes(), word2.as_bytes()); - let mut dp = vec![vec![0; n + 1]; m + 1]; + let m = word1.len(); + let n = word2.len(); + let s: Vec = word1.chars().collect(); + let t: Vec = word2.chars().collect(); + let mut f = vec![vec![0; n + 1]; m + 1]; + + for i in 0..=m { + f[i][0] = i as i32; + } + for j in 0..=n { + f[0][j] = j as i32; + } + for i in 1..=m { for j in 1..=n { - dp[i][j] = if word1[i - 1] == word2[j - 1] { - dp[i - 1][j - 1] + 1 + let a = s[i - 1]; + let b = t[j - 1]; + if a == b { + f[i][j] = f[i - 1][j - 1]; } else { - dp[i - 1][j].max(dp[i][j - 1]) - }; + f[i][j] = std::cmp::min(f[i - 1][j], f[i][j - 1]) + 1; + } } } - let max = dp[m][n]; - (m - max + (n - max)) as i32 + f[m][n] } } ``` diff --git a/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.cpp b/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.cpp index 5ffd550dab721..c131244f43e59 100644 --- a/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.cpp +++ b/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.cpp @@ -1,18 +1,25 @@ class Solution { public: int minDistance(string word1, string word2) { - int m = word1.size(), n = word2.size(); - vector> dp(m + 1, vector(n + 1)); - for (int i = 1; i <= m; ++i) dp[i][0] = i; - for (int j = 1; j <= n; ++j) dp[0][j] = j; + int m = word1.length(), n = word2.length(); + vector> f(m + 1, vector(n + 1)); + for (int i = 0; i <= m; ++i) { + f[i][0] = i; + } + for (int j = 0; j <= n; ++j) { + f[0][j] = j; + } for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { - if (word1[i - 1] == word2[j - 1]) - dp[i][j] = dp[i - 1][j - 1]; - else - dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1]); + char a = word1[i - 1]; + char b = word2[j - 1]; + if (a == b) { + f[i][j] = f[i - 1][j - 1]; + } else { + f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1; + } } } - return dp[m][n]; + return f[m][n]; } -}; \ No newline at end of file +}; diff --git a/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.go b/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.go index 3db6281fd3db2..42d17bf9d5237 100644 --- a/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.go +++ b/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.go @@ -1,21 +1,22 @@ func minDistance(word1 string, word2 string) int { m, n := len(word1), len(word2) - dp := make([][]int, m+1) - for i := range dp { - dp[i] = make([]int, n+1) - dp[i][0] = i + f := make([][]int, m+1) + for i := range f { + f[i] = make([]int, n+1) + f[i][0] = i } - for j := range dp[0] { - dp[0][j] = j + for j := 1; j <= n; j++ { + f[0][j] = j } for i := 1; i <= m; i++ { for j := 1; j <= n; j++ { - if word1[i-1] == word2[j-1] { - dp[i][j] = dp[i-1][j-1] + a, b := word1[i-1], word2[j-1] + if a == b { + f[i][j] = f[i-1][j-1] } else { - dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1]) + f[i][j] = 1 + min(f[i-1][j], f[i][j-1]) } } } - return dp[m][n] -} \ No newline at end of file + return f[m][n] +} diff --git a/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.java b/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.java index 9c6451dcfc900..57d4877d78e29 100644 --- a/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.java +++ b/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.java @@ -1,22 +1,24 @@ class Solution { public int minDistance(String word1, String word2) { int m = word1.length(), n = word2.length(); - int[][] dp = new int[m + 1][n + 1]; - for (int i = 1; i <= m; ++i) { - dp[i][0] = i; + int[][] f = new int[m + 1][n + 1]; + for (int i = 0; i <= m; ++i) { + f[i][0] = i; } - for (int j = 1; j <= n; ++j) { - dp[0][j] = j; + for (int j = 0; j <= n; ++j) { + f[0][j] = j; } for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { - if (word1.charAt(i - 1) == word2.charAt(j - 1)) { - dp[i][j] = dp[i - 1][j - 1]; + char a = word1.charAt(i - 1); + char b = word2.charAt(j - 1); + if (a == b) { + f[i][j] = f[i - 1][j - 1]; } else { - dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1]); + f[i][j] = Math.min(f[i - 1][j], f[i][j - 1]) + 1; } } } - return dp[m][n]; + return f[m][n]; } -} \ No newline at end of file +} diff --git a/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.py b/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.py index a66aaf76d4210..3681ffce2b1df 100644 --- a/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.py +++ b/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.py @@ -1,15 +1,15 @@ class Solution: def minDistance(self, word1: str, word2: str) -> int: m, n = len(word1), len(word2) - dp = [[0] * (n + 1) for _ in range(m + 1)] + f = [[0] * (n + 1) for _ in range(m + 1)] for i in range(1, m + 1): - dp[i][0] = i + f[i][0] = i for j in range(1, n + 1): - dp[0][j] = j - for i in range(1, m + 1): - for j in range(1, n + 1): - if word1[i - 1] == word2[j - 1]: - dp[i][j] = dp[i - 1][j - 1] + f[0][j] = j + for i, a in enumerate(word1, 1): + for j, b in enumerate(word2, 1): + if a == b: + f[i][j] = f[i - 1][j - 1] else: - dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1]) - return dp[-1][-1] + f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1 + return f[m][n] diff --git a/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.rs b/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.rs index bab2b3ca87e4c..32d895775a11a 100644 --- a/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.rs +++ b/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.rs @@ -1,18 +1,29 @@ impl Solution { pub fn min_distance(word1: String, word2: String) -> i32 { - let (m, n) = (word1.len(), word2.len()); - let (word1, word2) = (word1.as_bytes(), word2.as_bytes()); - let mut dp = vec![vec![0; n + 1]; m + 1]; + let m = word1.len(); + let n = word2.len(); + let s: Vec = word1.chars().collect(); + let t: Vec = word2.chars().collect(); + let mut f = vec![vec![0; n + 1]; m + 1]; + + for i in 0..=m { + f[i][0] = i as i32; + } + for j in 0..=n { + f[0][j] = j as i32; + } + for i in 1..=m { for j in 1..=n { - dp[i][j] = if word1[i - 1] == word2[j - 1] { - dp[i - 1][j - 1] + 1 + let a = s[i - 1]; + let b = t[j - 1]; + if a == b { + f[i][j] = f[i - 1][j - 1]; } else { - dp[i - 1][j].max(dp[i][j - 1]) - }; + f[i][j] = std::cmp::min(f[i - 1][j], f[i][j - 1]) + 1; + } } } - let max = dp[m][n]; - (m - max + (n - max)) as i32 + f[m][n] } } diff --git a/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.ts b/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.ts index e1515b6e2ce41..0698b5eee2ec2 100644 --- a/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.ts +++ b/solution/0500-0599/0583.Delete Operation for Two Strings/Solution.ts @@ -1,16 +1,21 @@ function minDistance(word1: string, word2: string): number { const m = word1.length; const n = word2.length; - const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0)); - for (let i = 1; i <= m; i++) { - for (let j = 1; j <= n; j++) { + const f: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0)); + for (let i = 1; i <= m; ++i) { + f[i][0] = i; + } + for (let j = 1; j <= n; ++j) { + f[0][j] = j; + } + for (let i = 1; i <= m; ++i) { + for (let j = 1; j <= n; ++j) { if (word1[i - 1] === word2[j - 1]) { - dp[i][j] = dp[i - 1][j - 1] + 1; + f[i][j] = f[i - 1][j - 1]; } else { - dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + f[i][j] = Math.min(f[i - 1][j], f[i][j - 1]) + 1; } } } - const max = dp[m][n]; - return m - max + n - max; + return f[m][n]; }