leetcode刷题日志—1.27、1.28

题目1:72. 编辑距离
在这里插入图片描述
  首先我们可以通过递归解决这道题目,根据最长子序列那道题,可以知道比对两个字符串,可以从最后往前面逐个遍历,如果这两个字符相同,我们就进行skip,继续往前;如果字符不同,我们有三种操作:删除、替换、插入;我们并不知道哪种操作可以为我们节省步数,所以进行分别递归,取三者的最小值;具体分析见下链接:
https://labuladong.gitbook.io/algo/dong-tai-gui-hua-xi-lie/zi-xu-lie-lei-xing-wen-ti/bian-ji-ju-li

在这里插入图片描述

if s1[i] == s2[j]:
    啥都别做(skip)
    i, j 同时向前移动
else:
    三选一:
        插入(insert)
        删除(delete)
        替换(replac

代码如下:

int minDistance(string word1, string word2) {
   
	int i = word1.size() - 1;
	int j = word2.size() - 1;
	return dp(word1, word2, i, j);
}
int dp(string word1, string word2, int i, int j) {
   
	//当word1首先遍历完成,则返回word2剩余的单词长度,也就是还需要操作的步数
	if (i == -1)	
		return j + 1;
	//word2同理
	if (j == -1)	
		return i + 1;
	//如果s[i]==s[j],那么就进行skip操作,跳到前一个字母
	if (word1[i] == word2[j])
		return dp(word1, word2, i - 1, j - 1);
	else {
   
		//对字母可以进行三种操作,删除、替换、插入,但我们并不知道哪种方式需要的步数最少
		//所以我们使用递归进行操作,再通过min函数进行判断
		//注意这道题目我们并不需要真实地对word进行插入和删除等操作,我们将这个过程“抽象化”
		//抽象地完成这一过程,虽然word1并没有实际的改变,但在程序中我们可以认为遍历过的部分已经和word2完全相同了
		return min(min(dp(word1, word2, i - 1, j) + 1,	//对word1进行删除
						dp(word1, word2, i - 1, j - 1) + 1), //替换
					dp(word1, word2, i, j - 1) + 1);	//插入
		
	}
}

  但是这样在力扣中是无法通过的,会超时,所以我们要增加**“记忆法”**,使用哈希表记录最小的dp[i,j],如果存在,我们就直接引用哈希表的数值。

int dp(string word1, string word2, map<pair<<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值