📅  最后修改于: 2023-12-03 15:12:24.756000             🧑  作者: Mango
给定两个字符串 $s$ 和 $t$,要求通过将字符移动到前端或末尾(不能改变字符顺序),将 $s$ 转换为 $t$,求最少需要进行多少次操作。
这是一道比较典型的字符串匹配问题,可以用动态规划来解决。
设 $dp(i,j)$ 表示将 $s[1:i]$ 转换为 $t[1:j]$ 所需的最少操作数。
状态转移方程有两种情况:
具体解释如下:
最终答案为 $dp(n,m)$,其中 $n$ 和 $m$ 分别为字符串 $s$ 和 $t$ 的长度。
def min_op(s: str, t: str) -> int:
n, m = len(s), len(t)
dp = [[0] * (m+1) for _ in range(n+1)]
for i in range(1, n+1):
dp[i][0] = i
for j in range(1, m+1):
dp[0][j] = j
for i in range(1, n+1):
for j in range(1, m+1):
if s[i-1] == t[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
len_s = s[:i].rfind(s[i-1])
len_t = t[:j].rfind(s[i-1])
dist = abs(i-1-len_t)
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + dist
return dp[n][m]
该算法的时间复杂度为 $O(nm)$,其中 $n$ 和 $m$ 分别为字符串 $s$ 和 $t$ 的长度。