今天的题本质上还是字符串划分问题
583. Delete Operation for Two String这道题主要的想法就是如何删除s和t中的字符串.首先dp[i][j]代表的是s中的到i-1为止最少匹配到t的j-1的字符所需要的最少删除次数
初值的话dp[i][0]和dp[0][j]都应该为1因为如果都把对方删除了就只能是一种情况
递推公式还是和s[i-1]和j[i-1]是否相等有关.如果相等则dp[i][j]继承dp[i-1][j-1].如果不等,则需要考虑两种删除情况,一种是删除s,所对应的就是dp[i][j-1]+1还有一种是删除t那么对应的就是dp[i-1][j]+1.两者取最小就行
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
dp=[[0 for _ in range(len(word2)+1)] for _ in range(len(word1)+1)]
for i in range(len(word1)+1):
dp[i][0]=i
for j in range(len(word2)+1):
dp[0][j]=j
for i in range(1,len(word1)+1):
for j in range(1,len(word2)+1):
if word1[i-1]==word2[j-1]:
dp[i][j]=dp[i-1][j-1]
else:
dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1)
return dp[-1][-1]
72. Edit Distance
这道题本质上和上一道题是一样的,
首先dp[i][j]代表的是s中的到i-1为止最少匹配到t的j-1的字符所需要的最少操作次数
初值的话dp[i][0]和dp[0][j]都应该为1因为如果都把对方删除了就只能是一种情况
递推公式还是和s[i-1]和j[i-1]是否相等有关.如果相等则dp[i][j]继承dp[i-1][j-1].如果不等,则需要考虑三种情况,一种是删除:,所对应的就是dp[i][j-1]+1.还有一种是增加,对应的就是删除t,那么对应的就是dp[i-1][j]+1.除此之外. 还有replace操作,对应的就是dp[i-1][j-1]+1,三者取最小即可
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
dp=[[0 for _ in range(len(word2)+1)] for _ in range(len(word1)+1)]
for i in range(len(word1)+1):
dp[i][0]=i
for j in range(len(word2)+1):
dp[0][j]=j
for i in range(1,len(word1)+1):
for j in range(1,len(word2)+1):
if word1[i-1]==word2[j-1]:
dp[i][j]=dp[i-1][j-1]
else:
dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+1)
return dp[-1][-1]