动态规划问题思路一般是,寻找状态转移方程(但是好难找,不会所以还是记住一些特殊的题目吧)。
一、编辑距离(LeetCode 72)
该算法在各大面经和笔试遇到过不知道多少次。
编辑距离比较简单,思路非常直接。
dp[i][j]:从word1的第i个元素变换到word2的第j个元素需要的修改次数。
word1[i-1]==word2[j-1],dp[i][j]=dp[i-1][j-1] ->如果元素相同,不需要修改
word1[i-1]!=word2[j-1],dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1->如果元素不同,需要修改
min中的三个元素对应着修改、删除、插入
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
n1=len(word1)
n2=len(word2)
#dp[i][j]代表word1到i的位置转换成word2到j的位置需要最少的步数。
dp=[[0]*(n2+1) for i in range(n1+1)]
for i in range(1,n1+1):
dp[i][0]=dp[i-1][0]+1
for i in range(1,n2+1):
dp[0][i]=dp[0][i-1]+1
for i in range(1,n1+1):
for j in range(1,n2+1):
if(word1[i-1]==word2[j-1]):
dp[i][j]=dp[i-1][j-1]
else:
#dp[i-1][j-1]:修改
#dp[i-1][j]:删除
#dp[i][j-1]:插入
dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
return dp[-1][-1]
二、最长公共子序列(LeetCode 1143)
dp[i][j]:text1[:i]和text2[:j]字符串之间的最长公共子序列。
class Solution:
def longestCommonSubsequence(self, text1: str, text2: str