首页 > 其他分享 >72_Edit_distance_编辑距离

72_Edit_distance_编辑距离

时间:2024-05-13 22:31:38浏览次数:19  
标签:distance 编辑 Edit 距离 int word1 72 word2 dp

题目描述

Given two strings word1 and word2, return the minimum number of operations required to convert word1 to word2.

You have the following three operations permitted on a word:

  • Insert a character
  • Delete a character
  • Replace a character

给定两个字符串word1word2, 求 编辑距离

基本思想

这是一个二维动态规划问题。假设word1的长度为n,word2的长度为m。

构建数组 dp, 则 \(dp[i][j]\) 表示 word1[0 ~ i] 转换成 word2[0~j] 相应的编辑距离。\(dp[i][j]\) 的更新公式如下:

  • 如果 \(word1[i] == word2[j]\), 则 $dp[i][j] $ = $dp[i-1][-1j] $
  • 如果 \(word1[i] != word2[j]\), 则 有三种情况可以将word1[0 ~ i] 转换为 word2[0~j]
    • 删除元素: word1[0~ i-1] 转换为 word2[0 ~ j] 的编辑距离是x1, word1[0~i] 删除 word1[i] 这个元素,可以得到 word2[0~j]
    • 增加元素: word1[0~ i] 转换为 word2[0 ~ j-1] 的编辑距离是x2, 则 word1[0~ i] 转换为 word2[0 ~ j-1] 之后,再增加一个元素word2[j] 既可以
    • 替换元素:word1[0~ i-1] 转换为 word2[0 ~ j-1]的编辑距离是x3, 当转化完毕之后,将word1[i] 替换为word2[j] 即可
    • 综上,当 \(word1[i] != word2[j]\) , $dp[i][j] $ = min(x1+1, x2+1, x3+1)

时间复杂度\(o(n^2)\)

代码

C++

    int minDistance(string word1, string word2) {
        int n = word1.size();
        int m = word2.size();
        if (n<=0) return m;
        if (m<=0) return n;
        vector<vector<int>> dp(n+1,vector<int>(m+1,0)); // dp[i,j] 表示 word[0~i] 转换到 word[0~j] 的编辑距离
        // 1- 初始化
        for(int i=0;i<=m;++i) {
            dp[0][i] = i;
        } 
        for(int i=0;i<=n;++i) {
            dp[i][0] = i;
        }
        for(int i=1;i<=n;++i) {
            for(int j=1; j<=m;++j) {
                int t = m+n;
                if (word1[i-1] == word2[j-1]) {
                    t = dp[i-1][j-1]; 
                } else {
                    t = min(min(dp[i-1][j]+1, dp[i][j-1]+1), dp[i-1][j-1]+1);
                }
                dp[i][j] = t;
            }
        }
        return dp[n][m];
    }

python

    def minDistance(self, word1: str, word2: str) -> int:
      m = len(word1)
      n = len(word2)
      if m<=0: return n
      if n<=0: return m   # 很重要
      dp = [ [ 0 for j in range(n+1)] for i in range(m+1)]
      # 1. 初始化
      for i in range(m+1):
        dp[i][0] = i
      for i in range(n+1):
        dp[0][i] = i
      for i in range(1, m+1):
          for j in range(1, n+1):
            if word1[i-1] == word2[j-1]:
              dp[i][j] = dp[i-1][j-1]
            else :
              t = min(dp[i-1][j] + 1,dp[i][j-1] + 1)
              dp[i][j] = min(t, dp[i-1][j-1] + 1)
      return dp[m][n]

标签:distance,编辑,Edit,距离,int,word1,72,word2,dp
From: https://www.cnblogs.com/douniwanli/p/18190204

相关文章

  • HTML 02 - Editors
    HTML-EditorsTolearnHTMLwewillrecommendyoutouseatexteditorlikeNotepad,becauseaNotepadwillhelpyoutounderstandtherequirementofeachtag,itwillnotsuggestanythingonitsownthatwillbehelpfultounderstandtheHTMLsyntax. ......
  • 怎么使用 MarsEdit 来管理博客园的博客
    MarsEdit可以管理任何支持MetaWeblog协议的博客。这点来说,比iawriter这类只支持wordpress,ghost这些主流博客架构的文本编辑器还是强很多的。要用MarsEidt来管理博客园,需要以下几步:1.在博客园上申请访问令牌2.在MarsEdit上添加博客园网址3.添加账号、密码4.......
  • 补档 https://github.com/taichi-framework/TaiChi/wiki/FAQ/9eeeef88cdbcee6a2834969
    taichi-framework/TaiChiPublicNotificationsFork 572 Star 5.9kCodePullrequestsActionsWikiSecurityInsightsFAQ weishueditedthispage onNov2,2018 · 17revisions如何使用点击右下角浮动按钮,然后选择“创建应用”......
  • Unity Editor下运行DoTween动画
    DOTweenEditorPreview.PrepareTweenForPreview(tar.GetTween());DOTweenEditorPreview.Start();以Test脚本为例:publicclassUTest:MonoBehaviour{publicTweenGetTween(){vartw=transform.DOMove(Vector3.left,2);tw.onUpdate=()=>......
  • 维和防暴队迅雷BT完整下载[1.16GB2.72GBMKV]高清加长版【1280P已完结】
    《维和防暴队》是一部让观众们热血沸腾的电影,讲述了一支由各国士兵组成的维和部队在遥远的非洲战场上与恐怖组织展开激烈对抗的故事。这部电影不仅仅是一部以战争为背景的动作片,更是反映了人类共同价值观和国际合作的重要性。在本文中,我将从情节、角色以及影片所传递的信息等......
  • Appium Inspector与Weditor:移动端测试的利器
    简介元素定位工具是在软件开发和自动化测试中精确定位和操作用户界面元素的工具。元素定位工具可以提供辅助定位元素、编写代码、录制用例、调试代码等功能。在移动端应用的自动化测试中,一款灵活的元素定位工具是必不可缺的,本节推荐两种定位工具,分别为官网提供的AppiumInspetor......
  • 『Solution』Codeforces 372D Choosing Subtree is Fun
    首先这个\(k\)的限制不是很好入手,考虑先从如果选取了区间\([l,r]\)来入手。那么此时连通块最小的\(siz\)就是把这些点拎出来建虚树对应在原树上的所有点。那么这个有个结论,考虑按\(\operatorname{dfn}\)序排序后的点为\(p_0\simp_{k-1}\),那么对应的最小\(sz\)就......
  • 读取速度超7300MB/s!佰维 NV7200 2TB SSD评测:不可思议的低温
    一、前言:专注高端的国产SSD最近几年,消费级市场出现了许多颇具实力的存储品牌,佰维(Biwin)就是其中之一。近日,我们快科技收到了佰维NV72002TBSSD,它拥有7200MB/s的顺序读取速度、4K随机读取也有1000KIOPS,非常适合用于游戏存储、AI创作等场景。佰维NV7200系列SSD采用的是联芸......
  • 472-便携式HD-SDI模拟源测试设备
    便携式HD-SDI模拟源测试设备一、平台简介   便携式手提CameraLink模拟源测试设备,以PCIe的HD-SDI播出卡和X86主板为基础,构建便携式的手提设备。   平台默认操作系统为win764位系统;具备丰富的外设接口,如VGA、HDMI、千兆网口、USB2.0/3.0以及方便的JTAG调试口;平台存储......
  • Apache Shiro 721反序列化漏洞Padding Oracle Attack
    目录漏洞原理复现修复方式漏洞原理Shiro的RememberMeCookie使用的是AES-128-CBC模式加密。其中128表示密钥长度为128位,CBC代表CipherBlockChaining,这种AES算法模式的主要特点是将明文分成固定长度的块,然后利用前一个块的密文对当前块的明文进行加密处理。这种模式的加......