给定两个字符串,可以有插入、替换和删除操作,求最小的操作次数使得两个字符串相等,原题如下典型的Dp问题,DP核心是求递推方程,递推方程求出来,问题也就解决了,DP问题的递推方程都是建立在上一步的基础上的,也就是说在上一步满足条件的情况下求这一步该怎么做,以本地为例,我们用
p[i-1][j-1]表示word1[0:i-1]和word2[0:j-1]通过上述三种操作达到相同状态所需要的最小步数,那么我们该如何求dp[i][j]呢?
如果word1[i] == word[j-1]那么不需要进行操作dp[i][j] = dp[i-1][j-1]
如果word1[i]!=word[j],则可以通过删除或者插入操作使两个字符串相等
通过删操作word1[i-1]已经和word2[j]达到相同的情况下,我们删除word[i]即可dp[i][j] = dp[i-1][j] +1
或者word1[i] 已经和word2[j-1]达到相同的情况下,我们删除word[j]即可dp[i][j] =dp[i-1][j-1]+1
其实插入和删除互相为逆操作,删除能达到的效果那么反过来通过插入对方也能达到相同的状态
AC代码
class Solution:
def minDistance(self, word1, word2):
"""
:type word1: str
:type word2: str
:rtype: int
"""
dp = [[0 for i in range(len(word1)+1)] for j in range(len(word2)+1)]
# print(dp)
for i in range(len(word1)+1):
dp[0][i] = i
for j in range(len(word2)+1):
dp[j][0] =j
# print(dp)
for i in range(1,len(word2)+1):
for j in range(1,len(word1)+1):
if word2[i-1] == word1[j-1]: dp[i][j] =dp[i-1][j-1]
else:
dp[i][j] = min(dp[i-1][j-1]+1,dp[i][j-1]+1,dp[i-1][j]+1)
return dp[-1][-1]
AC的时间有点长,应该可以再优化一下