代码随想录算法训练营Day45
力扣115.不同的子序列【hard】
力扣583.两个字符串的删除操作【medium】
力扣72.编辑距离【medium】
一、力扣115.不同的子序列【hard】
题目链接:力扣115.不同的子序列
视频链接:代码随想录
题解链接:灵茶山艾府
1、思路
- 时间复杂度: O ( n ∗ m ) O(n * m) O(n∗m)
2、代码
class Solution:def numDistinct(self, s: str, t: str) -> int:m, n = len(s), len(t)@cachedef dfs(i:int, j:int) -> int:if j < 0:return 1if i < j :return 0res = dfs(i - 1, j)if s[i] == t[j]:res += dfs(i - 1, j - 1)return resreturn dfs(m - 1, n - 1)
class Solution:def numDistinct(self, s: str, t: str) -> int:m, n = len(s), len(t)if m < n:return 0f = [[1] + [0] * n for _ in range(m + 1)]for i, x in enumerate(s):for j, y in enumerate(t):f[i + 1][j + 1] = f[i][j + 1]if s[i] == t[j]:f[i + 1][j + 1] += f[i][j]return f[m][n]
class Solution:def numDistinct(self, s: str, t: str) -> int:m, n = len(s), len(t)if m < n:return 0f = [1] + [0] * nfor i, x in enumerate(s):for j in range(min(n - 1, i), max(0,n - m + i) - 1, -1):if x == t[j]:f[j + 1] += f[j]return f[n]
二、力扣583.两个字符串的删除操作【medium】
题目链接:力扣583.两个字符串的删除操作
视频链接:代码随想录
1、思路
- 和1143一致
- 时间复杂度: O ( m ∗ n ) O(m * n) O(m∗n)
2、代码
class Solution:def minDistance(self, word1: str, word2: str) -> int:m, n = len(word1), len(word2)@cachedef dfs(i:int, j:int) -> int:if i < 0 or j < 0:return 0if word1[i] == word2[j]:return dfs(i - 1, j - 1) + 1else:return max(dfs(i - 1, j), dfs(i, j - 1))return m + n - 2 * dfs(m - 1, n - 1)
class Solution:def minDistance(self, word1: str, word2: str) -> int:m, n = len(word1), len(word2)f = [[0] * (n + 1) for _ in range(m + 1)]for i, x in enumerate(word1):for j, y in enumerate(word2):if x == y:f[i + 1][j + 1] = f[i][j] + 1else:f[i + 1][j + 1] = max(f[i][j + 1], f[i + 1][j])return m + n - 2 * f[m][n]
class Solution:def minDistance(self, word1: str, word2: str) -> int:m, n = len(word1), len(word2)f = [0] * (n + 1) for x in word1:pre = 0for j, y in enumerate(word2):tmp = f[j + 1]if x == y:f[j + 1] = pre + 1else:f[j + 1] = max(f[j + 1], f[j])pre = tmpreturn m + n - 2 * f[n]
三、力扣72.编辑距离【medium】
题目链接:力扣72.编辑距离
视频链接:代码随想录
题解链接:灵茶山艾府
1、思路
- 三个操作对应的状态要想明白
- 还有初值条件的转换
- 时间复杂度: O ( n ) O(n) O(n)
2、代码
class Solution:def minDistance(self, word1: str, word2: str) -> int:n,m = len(word1), len(word2) @cachedef dfs(i:int, j:int) -> int:if i < 0:return j + 1if j < 0 :return i + 1if word1[i] == word2[j]:return dfs(i - 1, j - 1)return min(dfs(i - 1, j), dfs(i, j -1), dfs(i - 1, j - 1)) + 1return dfs(n - 1, m - 1)
class Solution:def minDistance(self, word1: str, word2: str) -> int:n,m = len(word1), len(word2)f = [[0] * (m + 1) for _ in range(n + 1)]f[0] = list(range(m + 1))for i, x in enumerate(word1):f[i + 1][0] = i + 1for j, y in enumerate(word2):if x == y:f[i + 1][j + 1] = f[i][j]else:f[i + 1][j + 1] = min(f[i][j], f[i + 1][j], f[i][j +1]) + 1return f[n][m]
class Solution:def minDistance(self, word1: str, word2: str) -> int:n,m = len(word1), len(word2)f = list(range(m + 1))for x in word1:pre = f[0]f[0] += 1for j, y in enumerate(word2):tmp = f[j + 1]if x == y:f[j + 1] = preelse:f[j + 1] = min(pre, f[j], f[j +1]) + 1pre = tmpreturn f[m]