zoukankan      html  css  js  c++  java
  • 程序员面试金典-面试题 01.05. 一次编辑

    题目:

    字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。

    示例 1:

    输入:
    first = "pale"
    second = "ple"
    输出: True
     

    示例 2:

    输入:
    first = "pales"
    second = "pal"
    输出: False

    分析:

    我们可以利用编辑距离那道题的做法LeetCode 72. Edit Distance 编辑距离 (C++/Java),但实际上这道题只要求判断能否只需要一次编辑即可,我们可以设置两个指针同时遍历两个字符串,当出现不同时记录变化次数,当次数大于1时,返回false即可。

    程序:

    class Solution {
        public boolean oneEditAway(String first, String second) {
            int l1 = first.length();
            int l2 = second.length();
            dp = new int[l1+1][l2+1];
            for(int i = 0; i < dp.length; ++i){
                for(int j = 0; j < dp[i].length; ++j){
                    dp[i][j] = -1;
                }
            }
            if(minDistance(first, second, l1, l2) > 1)
                return false;
            return true;
        }
        private int minDistance(String word1, String word2, int l1, int l2){
            if(l1 == 0) return l2;
            if(l2 == 0) return l1;
            if(dp[l1][l2] >= 0)
                return dp[l1][l2];
            int res = 0;
            if(word1.charAt(l1-1) == word2.charAt(l2-1)){
                res = minDistance(word1, word2, l1-1, l2-1);
            }else{
                res = Math.min(minDistance(word1, word2, l1-1, l2),
                     Math.min(minDistance(word1, word2, l1, l2-1),
                        minDistance(word1, word2, l1-1, l2-1))) + 1;
            }
            dp[l1][l2] = res;
            return res;
        }
        private int[][] dp;
    }
    class Solution {
        public boolean oneEditAway(String first, String second) {
            int fl = first.length();
            int sl = second.length();
            if(Math.abs(fl - sl) > 1)
                return false;
            char[] arr1 = first.toCharArray();
            char[] arr2 = second.toCharArray();
            int i = 0;
            int j = 0;
            int count = 0;
            while(i < fl && j < sl){
                if(arr1[i] == arr2[j]){
                    i++;
                    j++;
                }else{
                    if(i + 1 < fl && arr1[i+1] == arr2[j])
                        i++;
                    else if(j + 1 < sl && arr1[i] == arr2[j+1])
                        j++;
                    else{
                        i++;
                        j++;
                    }
                    count++;
                }
                if(count > 1)
                    return false;
            }
            return count + (fl-i) + (sl-j) > 1 ? false : true;
        }
    }
  • 相关阅读:
    MySQL的sql_mode合理设置
    Redis
    启动Jupyter Notebook提示ImportError: DLL load failed: 找不到指定的模块。
    Linux目录结构
    修改mysql密码报错: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '
    springmvc运行原理
    博客园美化
    数据搜索
    git
    window
  • 原文地址:https://www.cnblogs.com/silentteller/p/12389970.html
Copyright © 2011-2022 走看看