• 代码随想录第五十六天


    代码随想录第五十六天

    583. 两个字符串的删除操作

    给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
    1、dp[i][j]:以word1[i-1]字符结尾,word2[j-1]字符结尾的两个字符串找到相同所需的最小步数
    2、if word1[i-1]==word2[j-1]
    dp[i][j]=dp[i-1][j-1],即此时啥都不用做,直接等于word1[i-2]和word2[j-2]找到相同子序列所需的最小步数就行
    else
    i、在word1[i-1]与word2[j-2]的基础上删除word2[j-1]
    ii、在word1[i-2]与word2[j-1]的基础上删除word2[j-1]
    iii、在word1[i-2]与word2[j-2]的基础上删除word1[i-1],word2[j-1]
    dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+2)
    3、初始化
    dp[0][j]=j
    dp[i][0]=i
    4、外层遍历word1,内层遍历word2
    5、模拟
    代码如下:

    int deleteSubSequence(string s, string t)
    	{
    		vector<vector<int>>dp(s.size() + 1, vector<int>(t.size() + 1, 0));
    		for (int j=0;j<=t.size();j++)
    		{
    			dp[0][j] = j;
    		}
    		for (int i=0;i<=s.size();i++)
    		{
    			dp[i][0] = i;
    		}
    		for (int i=1;i<=s.size();i++)
    		{
    			for (int j=1;j<=t.size();j++)
    			{
    				if (s[i-1] == t[j-1])
    				{
    					dp[i][j] = dp[i - 1][j - 1];
    				}
    				else
    				{
    					dp[i][j] = min(min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + 2);
    				}
    			}
    		}
    		return dp[s.size()][t.size()];
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    72. 编辑距离

    给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
    你可以对一个单词进行如下三种操作:
    插入一个字符
    删除一个字符
    替换一个字符
    示例 1: 输入:word1 = “horse”, word2 = “ros” 输出:3 解释: horse -> rorse (将 ‘h’ 替换为 ‘r’) rorse -> rose (删除 ‘r’) rose -> ros (删除 ‘e’)
    示例 2: 输入:word1 = “intention”, word2 = “execution” 输出:5 解释: intention -> inention (删除 ‘t’) inention -> enention (将 ‘i’ 替换为 ‘e’) enention -> exention (将 ‘n’ 替换为 ‘x’) exention -> exection (将 ‘n’ 替换为 ‘c’) exection -> execution (插入 ‘u’)

    1、dp[i][j]:以word1[i-1]字符结尾,word2[j-1]字符结尾的两个字符串,将word1转换为word2的最小步骤
    2、if word1[i-1]==word2[j-1]
    dp[i][j]=dp[i-1][j-1],即此时啥都不用做,等于由word1[i-2]转换为word2[j-2]的步数就行
    else
    i、在word1[i-1]与word2[j-2]的基础上删除word2[j-1],相当于在word1中增加字符
    ii、在word1[i-2]与word2[j-1]的基础上删除word2[j-1]
    iii、在word1[i-2]与word2[j-2]的基础上将word1[i-1]替换为word2[j-1]
    dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+1)
    3、初始化
    dp[0][j]=j
    dp[i][0]=i
    4、外层遍历word1,内层遍历word2
    5、模拟
    代码如下:

    int editeDistance(string s, string t)
    	{
    		vector<vector<int>>dp(s.size() + 1, vector<int>(t.size() + 1, 0));
    		for (int j=0;j<=t.size();j++)
    		{
    			dp[0][j] = j;
    		}
    		for (int i=0;i<=s.size();i++)
    		{
    			dp[i][0] = i;
    		}
    		for (int i=1;i<=s.size();i++)
    		{
    			for (int j=1;j<=t.size();j++)
    			{
    				if (s[i - 1] == t[j - 1])
    				{
    					dp[i][j] = dp[i - 1][j - 1];
    				}
    				else
    				{
    					int tmp = min(dp[i][j - 1] + 1, dp[i - 1][j] + 1);
    					dp[i][j] = min(dp[i - 1][j - 1] + 1, tmp);
    				}
    			}
    		}
    		return dp[s.size()][t.size()];
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    算法通关村第13关【黄金】| 数论问题
    LibGdx学习记录
    预约按摩小程序功能及使用指南;
    求解多旅行推销员问题的两部分编码遗传算法算子
    浏览器中的Event Loop
    分享如何撰写吸引人的开发信
    【Maven入门篇】(1)详细讲解Maven的安装&&报错解决
    利用资金曲线选择策略加减仓时机
    pytest实现日志按用例输出到指定文件中
    第二章 使用管理门户监视IRIS - 系统使用情况指示器
  • 原文地址:https://blog.csdn.net/weixin_47880957/article/details/127891751