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;
        }
    }
  • 相关阅读:
    error in ./src/views/demo/ueditor.vue Module build failed: Error: Cannot find module 'node-sass' Require stack:
    Spring Cloud Stream 定时任务消息延迟队列
    项目结构介绍
    Java面试题
    SpringBoot中用SpringSecurity实现用户登录并返回其拥有哪些角色
    MySQL索引优化
    MySQL中的执行计划explain
    SpringBoot之单体应用
    SpringBoot之SSM多模块应用
    Spring-aop面向切面编程笔记
  • 原文地址:https://www.cnblogs.com/silentteller/p/12389970.html
Copyright © 2011-2022 走看看