字符串匹配问题是dp问题中一类一种经典问题,包括了最长匹配字符串,和编辑距离等。
我们以编辑距离为例
之所以将这几个问题放在一起讨论,因为都是有相同的dp设计思路,和状态转移方程的设计。
- 状态设计思路:二维矩阵
dp[i][j]
表示word1前i
个字符与word2的前j
个字符下的子问题,在本问题中就是代表 word1 到i
位置转换成 word2 到j
位置需要最少步数。 - 状态转移方程:如果
word1[i] == word[j]
,说明当前两个字符串一样,可以从对角线转移得到。否则考虑其上方,前方,和对角线三个元素的最值转移得到。在本题中dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j])+1
。
当然本题还可以考虑如何理解这个状态转移方程,当
dp[i-1][j-1]
到dp[i][j]
需要进行替换操作,dp[i-1][j]
到d[i][j]
需要进行删除操作,dp[i][j-1]
到d[i][j]
需要进行添加操作。
- 初始条件:也就是考虑当word1或word2为空字符串时的对应dp初始值。对应的就是
dp[0][j],dp[i][0]
。本题中设置为
class Solution(object):
def minDistance(self, word1, word2):
"""
:type word1: str
:type word2: str
:rtype: int
"""
n = len(word1)
m = len(word2)
# column is word1, row is word2 word1 与word2的顺序不重要
dp = [[0 for i in range(n+1)]for _ in range(m+1)]
for i in range(m+1)