zoukankan      html  css  js  c++  java
  • 编辑距离12 · Edit Distance12

    [抄题]:

    给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。

    你总共三种操作方法:

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

    [思维问题]:

    [一句话思路]:

    分析双序列变换的所有情况

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. 由于数组多加了一位,所有的上限都要加1
    2. Math.min最多一次只能比较2个数

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    注意上限都要加1

    [复杂度]:Time complexity: O(n^2) Space complexity: O(n^2)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    双序列型dp

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

    583. Delete Operation for Two Strings 只能删除:还是dp

    712. Minimum ASCII Delete Sum for Two Strings 加一个ascii转化

     [代码风格] :

    else热脸贴冷屁股,不要空格,更不要换行

    public class Solution {
        /*
         * @param word1: A string
         * @param word2: A string
         * @return: The minimum number of steps.
         */
        public int minDistance(String word1, String word2) {
            //state
            int m = word1.length();
            int n = word2.length();
            //initialization
            int[][] dp = new int[m + 1][n + 1];
            //m == 0
            for (int i = 0; i < n + 1; i++) {
                dp[0][i] = i;
            }
            // n == 0
            for (int i = 0; i < m + 1; i++) {
                dp[i][0] = i;
            }
            //function
            for (int i = 1; i < m + 1; i++) {
                for (int j = 1; j < n + 1; j++) {
                    if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
                        dp[i][j] = dp[i - 1][j - 1];
                    }else {
                        dp[i][j] = 1 + Math.min(dp[i - 1][j - 1],Math.min(dp[i][j - 1],dp[i - 1][j]));
                    }
                }
            }
            //answer
            return dp[m][n];
        }
    }
    View Code

    一步编辑

    [抄题]:

    给你两个字符串 S 和 T, 判断他们是否只差一步编辑。

    给你字符串 s = "aDb", t= "adb" 
    返回 true

     [暴力解法]:

    时间分析:

    空间分析:

    [思维问题]:

    原始想法:相差一位字母时,每删一个字母,比较字符串是否相同。问题是没有办法比较字符串是否相同

    [一句话思路]:

    1. 柿子要找软的捏,从特殊情况讨论开始
    2. 相差一位字母时,删除第一个不相同的字母,用(.substring equals不是==号!)比较剩余的字符串是否相同 下图。

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. 两个字符串长度不符合,直接在返回函数里取反 isOneEditDistance(t, s)
    2. 用count统计不相同的字母个数,为1时才返回true。

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    注意简写:return true if a = return a 

    [复杂度]:Time complexity: O(n) Space complexity: O(n)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    由于已经讨论特殊情况了,比较字符串是否相等即可。不用任何的数据结构、算法

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

  • 相关阅读:
    Docker 给 故障停掉的 container 增加 restart 参数
    使用docker化的nginx 反向代理 docker化的GSCloud 的方法
    apache benchmark 的简单安装与测试
    mysql5.7 的 user表的密码字段从 password 变成了 authentication_string
    Windows 机器上面同时安装mysql5.6 和 mysql5.7 的方法
    python4delphi 安装
    见证下神奇的时刻
    windows下面安装Python和pip终极教程
    python如何安装pip和easy_installer工具
    Tushare的安装
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8440994.html
Copyright © 2011-2022 走看看