力扣---面试题 01.05. 一次编辑

发布时间 2023-03-28 21:15:41作者: Owlwu

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

 

示例 1:

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

示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/one-away-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

见注释即可。

class Solution {
    public boolean oneEditAway(String first, String second) {
        // 先对长度进行判断,很容易可以想到,如果两者长度相差长度大于1,则必定不符合要求,直接返回false即可。
        // 继续进行判断,发现长度符合的情况下又可以分成两种:
        // 1. 给长度更低的那一个字符串添加一个字符。可以先同时从两个字符串的开头进行遍历。遇到不等的情况下给长度较低的那个字符串添加一个字符,然后接着遍历。再次遇到不等的情况,意味着不符合要求。
        // 2. 两者的长度相等,此时直接判断两个字符串是否只有小于等于一个的字符不同,利用一个指针同时遍历,利用一个额外的布尔类型判断是否已经进行更改过即可。
        int len1 = first.length();
        int len2 = second.length();
        // 长度相等,
        if (len1 == len2) {
            return updateBoolean(first, second);
        } else if (len1 > len2) {
            if (len1 - len2 > 1) {
                return false;
            } else {
                return insertBoolean(second, first);
            }
        } else {
            if (len2 - len1 > 1) {
                return false;
            } else {
                return insertBoolean(first, second);
            }
        }
    }
    // 给长度较小的字符串添加字符
    private boolean insertBoolean(String first, String second) {
        int p1 = 0;
        int p2 = 0;
        // 判断之前是否已经进行过插入操作。
        boolean ju = false;
        while (p1 < first.length() && p2 < second.length()) {
            if (first.charAt(p1) != second.charAt(p2)) {
                if (ju) {
                    return false;
                } else {
                    p2 ++;
                    ju = true;
                }
            } else {
                p1 ++;
                p2 ++;
            }
        }
        return true;
    }
    // 长度相等的情况。
    private boolean updateBoolean(String first, String second) {
        // 判断之前是否已经进行过更新操作。
        boolean ju = false;
        int p1 = 0;
        int p2 = 0;
        for (int i = 0; i < first.length(); i ++) {
            if (first.charAt(i) != second.charAt(i)) {
                if (ju) {
                    return false;
                } else {
                    ju = true;
                }
            }
        }
        return true;
    }
}