首页 > 其他分享 >编辑距离(二维动态规划)

编辑距离(二维动态规划)

时间:2025-01-09 21:45:54浏览次数:1  
标签:字符 int 编辑 二维 word1 word2 动态 替换 个字符

给你两个单词 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')

 

对于代码中word1[i-1]!=word2[j-1]的解释:

当我们获得 D[i][j-1],D[i-1][j] 和 D[i-1][j-1] 的值之后就可以计算出 D[i][j]。

D[i][j-1] 为 A 的前 i 个字符和 B 的前 j - 1 个字符编辑距离的子问题。即对于 B 的第 j 个字符,我们在 A 的末尾添加了一个相同的字符,那么 D[i][j] 最小可以为 D[i][j-1] + 1;

D[i-1][j] 为 A 的前 i - 1 个字符和 B 的前 j 个字符编辑距离的子问题。即对于 A 的第 i 个字符,我们在 B 的末尾添加了一个相同的字符,那么 D[i][j] 最小可以为 D[i-1][j] + 1;

D[i-1][j-1] 为 A 前 i - 1 个字符和 B 的前 j - 1 个字符编辑距离的子问题。即对于 B 的第 j 个字符,我们修改 A 的第 i 个字符使它们相同,那么 D[i][j] 最小可以为 D[i-1][j-1] + 1。特别地,如果 A 的第 i 个字符和 B 的第 j 个字符原本就相同,那么我们实际上不需要进行修改操作。在这种情况下,D[i][j] 最小可以为 D[i-1][j-1]。

class Solution {
public:
    int minDistance(string word1, string word2) {
        int m = word1.size();
        int n = word2.size();
        //dp[i][j]表示word1的前i个字符转换成word2的前j个字符需要的最少操作
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));
        //初始化
        //当word2字符数为0时,word1字符数逐渐增加时,需要删除相应的字符
        for(int i=0;i<=m;i++)   dp[i][0]=i;
        //当word1字符数为0时,word2字符数逐渐增加时,需要增加相应的字符
        for(int i=0;i<=n;i++)   dp[0][i]=i;
        //计算其他的
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(word1[i-1]==word2[j-1]){//不需要操作
                    dp[i][j]=dp[i-1][j-1];
                }else{
                    dp[i][j]=min(dp[i-1][j],dp[i][j-1]);
                    dp[i][j]=min(dp[i][j],dp[i-1][j-1]);
                    dp[i][j]+=1;
                }
            }
        }
        return dp[m][n];
    }
};

 

标签:字符,int,编辑,二维,word1,word2,动态,替换,个字符
From: https://www.cnblogs.com/yueshengd/p/18662929

相关文章

  • 最长公共子序列(二维动态规划)
    给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"ac......
  • MyBatis 动态 SQL、多表查询与注解开发详解
    MyBatis动态SQL、多表查询与注解开发详解1.MyBatis动态SQLMyBatis提供了强大的动态SQL功能,允许我们根据不同的条件拼接SQL语句,避免了手动拼接SQL的繁琐和错误。常见的动态SQL标签包括:if:用于条件判断,根据条件是否成立来决定是否拼接SQL片段。choose(when,ot......
  • 703 二维前缀和
    //703二维前缀和.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/894给一个n×m的矩阵a11,a12,…,a1m,…,anm和q个询问。每次询问给出四个数x1,y1,x2,y2,求∑i=x1~x2∑j=y1~y2a[ij]的值。输入格式第......
  • 【YashanDB知识库】进行load data的时候报找不到动态库liblz4.so
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7863047.html?templateId=1718516现象23.2版本的依赖项准备里指明,要依赖动态库:liblz4.so,liblz4.so.1,liblz4.so.1.9.3在执行loaddata的时候报找不到动态库liblz4.so操作系统在/lib64/目录下有liblz4.......
  • 【C++动态规划 数学】1039. 多边形三角剖分的最低得分|2130
    本文涉及知识点C++动态规划数学LeetCode1039.多边形三角剖分的最低得分你有一个凸的n边形,其每个顶点都有一个整数值。给定一个整数数组values,其中values[i]是第i个顶点的值(即顺时针顺序)。假设将多边形剖分为n-2个三角形。对于每个三角形,该三角形的值......
  • 富文本编辑器-WangEditor
    vue2+ WangEditor 引入WangEditornpminstallwangeditor--save富文本编辑器组件:WangEditor.vue<template><!--富文本编辑器组件--><div><divref="editor"style="text-align:left;"></div></d......
  • 最小路径和(二维动态规划)
    给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。 示例1:输入:grid=[[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径1→3→1→1→1的总和最小。示例2:输入:grid=[[1,2......
  • 不同路径(二维动态规划)
    一个机器人位于一个 mxn 网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径? 示例1:输入:m=3,n=7输出:28示例2:输入:m=3,n=2输出:3解释......
  • 智能监控:揭开Web元素动态管理的奥秘
    一、Web元素动态监控:网页背后的“智能眼”        在互联网的世界里,Web元素动态监控犹如一双隐藏在网页背后的“智能眼”。它时刻监控网页中的各类元素,无论是新闻资讯网站的文字更新、图片切换,还是电商平台商品详情页的价格波动、库存变化,甚至社交平台上的新消息提示,......
  • [QMT量化交易小白入门]-十一、miniQMT和QMT根据当前运行模式动态加载不同的行情模块和
    本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。相关阅读小白也能做量化:零门槛QMT、Ptrade免......