leetcode做题笔记72

给你两个单词 word1word2请返回将 word1 转换成 word2 所使用的最少操作数

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

思路一:动态规划

cpp 复制代码
int minDistance(char * word1, char * word2){
    //动态规划
        int dp[501][501];
        int i,j;
        int size1=strlen(word1);
        int size2=strlen(word2);
        dp[0][0]=0;
        for(i=0;i<=size2;i++){
            dp[0][i]=i;
        }
        for(i=0;i<=size1;i++){
            dp[i][0]=i;
        }
        for(i=1;i<=size1;i++){
            for(j=1;j<=size2;j++){
                dp[i][j]=fmin(dp[i-1][j],fmin(dp[i][j-1],dp[i-1][j-1]))+1;
                if(word1[i-1]==word2[j-1]){
                    dp[i][j]=fmin(dp[i][j],dp[i-1][j-1]);
                }
            }
        }
        return dp[size1][size2];
}

时间复杂度O(n^2),空间复杂度O(n)

分析:

本题将一个字符串变为另一个字符串,首先长度需变为一致,即删除一个或者插入一个,再将两个字符串中字符变为相同,删除和插入的操作可转化为 dp[i][j]=fmin(dp[i-1][j],fmin(dp[i][j-1],dp[i-1][j-1]))+1;,替换的操作转化为dp[i][j]=fmin(dp[i][j],dp[i-1][j-1]);最后输出dp[size1][size2]

总结:

本题考察动态规划问题,将删除,插入,替换的操作转换为动态规划内比较两个格子值大小即可解决

相关推荐
无心水18 分钟前
【Java面试笔记:基础】8.对比Vector、ArrayList、LinkedList有何区别?
java·笔记·面试·vector·arraylist·linkedlist
卡皮巴拉爱吃小蛋糕26 分钟前
MySQL的MVCC【学习笔记】
数据库·笔记·mysql
清流君36 分钟前
【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
数据库·人工智能·笔记·mysql·ue5·数字孪生
梁下轻语的秋缘1 小时前
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
c++·算法·蓝桥杯
CODE_RabbitV1 小时前
【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
算法
BOB-wangbaohai2 小时前
Flowable7.x学习笔记(十四)查看部署流程Bpmn2.0-xml
xml·笔记·学习
mit6.8242 小时前
[贪心_7] 最优除法 | 跳跃游戏 II | 加油站
数据结构·算法·leetcode
keep intensify2 小时前
通讯录完善版本(详细讲解+源码)
c语言·开发语言·数据结构·算法
shix .2 小时前
2025年PTA天梯赛正式赛 | 算法竞赛,题目详解
数据结构·算法
风铃儿~2 小时前
Java面试高频问题(26-28)
java·算法·面试