• 非科班菜鸡算法学习记录 | 代码随想录算法训练营第56天|| 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇


    583. 两个字符串的删除操作
    583. Delete Operation for Two Strings

    知识点:动规
    状态:看思路自己写
    思路:

      dpij为到i-1和j-1为止的最小操作次数,需要初始化

    dp[i][0] 表示i-1要想变成和-1一样的删除次数,删除次数= i ;

    递推公式:

    当i-1 = j-1 时,不需要删,所以dp[i][j] = dp[i-1][j-1];

    不等时三种情况:

    dp[i][j] = min(dp[i][j-1]+ 1,min(dp[i-1][j]+1, dp[i-1][j-1] +2 ) );

    1. class Solution {
    2. public:
    3. int minDistance(string word1, string word2) {
    4. vectorint >>dp(word1.size()+1,vector<int >(word2.size()+1, 0));
    5. // dpij为到i-1和j-1为止的最小操作次数
    6. for(int i = 0; i <=word1.size(); i++) dp[i][0] = i;
    7. // dp[i][0] 表示i-1要想变成和0一样的删除次数,删除次数=i
    8. for(int j = 0; j <=word2.size(); j++) dp[0][j] = j;
    9. for(int i = 1; i <= word1.size(); i++) {
    10. for(int j = 1; j <=word2.size(); j++) {
    11. if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1];
    12. else{
    13. dp[i][j] = min(dp[i][j-1]+ 1,min(dp[i-1][j]+1, dp[i-1][j-1] +2 ) );
    14. }
    15. }
    16. }
    17. return dp[word1.size()][word2.size()];
    18. }
    19. };

    求最大字串,最后两个串的长度 -  2 * 最大字串长

    1. class Solution {
    2. public:
    3. int minDistance(string word1, string word2) {
    4. vectorint >>dp(word1.size()+1,vector<int >(word2.size()+1, 0));
    5. // dpij为到i-1和j-1为止的最长相同字串数字
    6. for(int i = 1; i <= word1.size(); i++) {
    7. for(int j = 1; j <=word2.size(); j++) {
    8. if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
    9. else{
    10. dp[i][j] = max(dp[i][j-1],dp[i-1][j] );
    11. }
    12. }
    13. }
    14. return (word1.size()+word2.size()) - 2*dp[word1.size()][word2.size()];
    15. }
    16. };

    72. 编辑距离
    72. Edit Distance

    知识点:动规
    状态:不会
    思路:

    1. class Solution {
    2. public:
    3. int minDistance(string word1, string word2) {
    4. vectorint >>dp(word1.size()+1,vector<int >(word2.size()+1, 0));
    5. // dpij为到i-1和j-1为止的最小操作次数
    6. for(int i = 0; i <=word1.size(); i++) dp[i][0] = i;
    7. // dp[i][0] 表示i-1要想变成和0一样的删除次数,删除次数=i
    8. for(int j = 0; j <=word2.size(); j++) dp[0][j] = j;
    9. for(int i = 1; i <= word1.size(); i++) {
    10. for(int j = 1; j <=word2.size(); j++) {
    11. if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1];
    12. //相同时不操作
    13. else{
    14. //dp[i][j] = min(dp[i][j-1]+ 1,min(dp[i-1][j]+1, dp[i-1][j-1] +1) );
    15. dp[i][j] = min({dp[i][j-1]+ 1,dp[i-1][j]+1, dp[i-1][j-1] +1});
    16. //增:dp[i][j-1]或者dp[i-1][j]
    17. //删:删除一个等于另一个加一
    18. //改:等于改成word1[i-1] == word2[j-1],所以dp[i][j] = dp[i-1][j-1] + 1;
    19. //取这仨的最小值
    20. }
    21. }
    22. }
    23. return dp[word1.size()][word2.size()];
    24. }
    25. };

    编辑距离总结篇   

    代码随想录

  • 相关阅读:
    20240425在Ubuntu20.04下检测HDD机械硬盘
    spring-boot-starter-validation数据校验全局异常拦截处理
    一个接口有多个实现类时,调用接口时,如何判定调用的哪个实现类?
    golang flag 包的使用指北
    Blender新手入门笔记收容所(一)
    Netty高级应用及聊天室实战
    SpringBoot学习笔记-项目初始化
    【Android】源码中的建造者模式
    FPS_AI编程
    js实现防抖函数,输入框持续输入打印最终的值
  • 原文地址:https://blog.csdn.net/weixin_44483162/article/details/132685127