【LeetCode】72. Edit Distance

栏目: 编程工具 · 发布时间: 7年前

内容简介:【LeetCode】72. Edit Distance

问题描述

https://leetcode.com/problems/edit-distance/#/description

Given two words word1 and word2 , find the minimum number of steps required to convert word1 to word2 . (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character

b) Delete a character

c) Replace a character

word1 变为 word2 ,可以有三种操作,删除、替换、增加一个字符,每执行一次算作一次操作,返回至少需要多少次操作。

算法

使用动态规划,设 f(i,j) 表示将 word1 的前i个字符转化为 word2 的前j个字符,设 n=word1.length() , m=word2.length() ,则最终的结果就是求: f(n, m)

下面是动态转移方程:

  1. 初始条件, f(0,k) = f(k,0) = kf(0,k)=k 表示将 word1 的前 0 个字符转换为 word2 的前 k 个字符所需操作数,因为是从 0 个字符变换为 k 个字符,自然需要 k 次操作
  2. word1[i] = word2[j] 时,有 f(i,j) = f(i-1,j-1) ,因为此时不需要操作,所以操作次数与前面的变换次数相等
  3. word2[i] != word2[j] 时,有 f(i,j) = 1 + min{f(i,j-1) , f(i-1,j) , f(i-1,j-1)}f(i,j-1) 表示 insert , f(i-1,j) 表示 deletef(i-1,j-1) 表示 replace

时间复杂度 O(nm)

代码

public class Solution {

        /**
         * 将word1变为word2,可以有三种操作,删除、替换、增加一个字符,每执行一次算作一次操作,返回至少需要多少次操作。
         * 算法:
         * 使用动态规划,设f(i,j)表示将word1的前i个字符转化为word2的前j个字符,设n=word1.length(), m=word2.length(),则最终的结果就是求:f(n, m)
         * 下面是动态转移方程:
         * 1. 初始条件,f(0,k) = f(k,0) = k,f(0,k)=k表示将word1的前0个字符转换为word2的前k个字符所需操作数,因为是从0个字符变换为k个字符,自然需要k次操作
         * 2. word1[i] = word2[j]时,有f(i,j) = f(i-1,j-1),因为此时不需要操作,所以操作次数与前面的变换次数相等
         * 3. word2[i] != word2[j]时,有f(i,j) = 1 + min{f(i,j-1), f(i-1,j), f(i-1,j-1)},f(i,j-1)表示insert, f(i-1,j)表示delete,f(i-1,j-1)表示replace
         */
        public int minDistance(String word1, String word2) {
            int n = word1.length();
            int m = word2.length();

            int[][] f = new int[n+1][m+1];
            for(int i=0;i<=m;i++) {
                f[0][i] = i;
            }
            for(int i=0;i<=n;i++) {
                f[i][0] = i;
            }
            for(int i=1;i<=n;i++) {
                for(int j=1;j<=m;j++) {
                    if(word1.charAt(i-1) == word2.charAt(j-1)) {
                        f[i][j] = f[i-1][j-1];
                    } else {
                        f[i][j] = 1 + Math.min(f[i][j-1], Math.min(f[i-1][j], f[i-1][j-1]));
                    }
                }
            }
            return f[n][m];
        }
    }
转载请注明出处

http://www.zgljl2012.com/leetcode-72-edit-distance/


以上所述就是小编给大家介绍的《【LeetCode】72. Edit Distance》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

浅薄

浅薄

[美]尼古拉斯·卡尔 / 刘纯毅 / 中信出版社 / 2015-11 / 49.00 元

互联网时代的飞速发展带来了各行各业效率的提升和生活的便利,但卡尔指出,当我们每天在翻看手机上的社交平台,阅读那些看似有趣和有深度的文章时,在我们尽情享受互联网慷慨施舍的过程中,我们正在渐渐丧失深度阅读和深度思考的能力。 互联网鼓励我们蜻蜓点水般地从多种信息来源中广泛采集碎片化的信息,其伦理规范就是工业主义,这是一套速度至上、效率至上的伦理,也是一套产量最优化、消费最优化的伦理——如此说来,互......一起来看看 《浅薄》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具