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’)思路可以从后往前思考从最后一步开始倒推发现可以被进一步分解为相同的子问题故用动态规划最直观就用二维dp。画动态规划表,假设word1的状态作为纵轴j,word2的状态为横轴i,那么当前状态dp[j][i]可以分为两种情况:当前状态对应的word1和word2序列字符相同:那么无需增加操作步骤,可以进一步求dp[j-1][i-1]的状态当前状态下序列字符不同:此时因为有三种操作,故分为三种情况,取操作步骤最小的:进行增加字符操作:操作步骤1,问题变为求dp[j][i-1]状态进行删除字符操作:操作步骤1,问题变为求dp[j-1][i]状态进行修改字符操作:操作步骤1,问题变为求dp[j-1][i-1]状态“”word2“”wordp[j][i]d1res注意因为添加了空字符的情况表格的坐标和字符串的序列不再相同在判断word1和word2字符的时候要转换成序列然后填充完状态转移表,最右下角的即为最小的结果代码class Solution{public: int minDistance(string word1, string word2){introwword1.size()1;intcolword2.size()1;vectorvectorintdp(row,vectorint(col,0));dp[0][0]0;for(inti1;icol;i){dp[0][i]dp[0][i-1]1;}for(intj1;jrow;j){dp[j][0]dp[j-1][0]1;for(intk1;kcol;k){// 注意此处对比的是word1和word2对应序列的字符需要-1而不是状态转移表中的值 if(word1[j-1]word2[k-1]){dp[j][k]dp[j-1][k-1];}else{dp[j][k]min(min(dp[j-1][k],dp[j][k-1]),dp[j-1][k-1])1;}}}returndp.back().back();}};值得注意的是,在填的表格里包含了空字符的问题,在判断字符相等时,字符串的序列为对应的表格坐标-1再次注意感谢 感谢华南溜达虎 力扣 力扣hot100
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2424199.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!