LeetCode 面试题 01.05. 一次编辑

题目

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

示例 1:

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

示例 2:

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

思路

对于是否满足题目要求的操作,分下面三种情况:
1、first.len < second.len 只需要考虑 first加一个字符能否变成 second
2、first.len = second.len 考虑 first和second是否只有一个或者0个字符不同,而如果是0个字符不同,其实就是 first=second
3、first.len > second.len 把second和first换一个位置,其实就是情况1

故,其实真实的判断就只要写两种,一种是两者长度相等的时候,判断first和second之前是否相差一个字符,另一种是判断短的字符串first加一个字符后能否变成second。

AC代码

点击查看代码
class Solution {
    public boolean oneEditAway(String first, String second) {
        if( first.equals(second) ) {
            return true;
        }
        int lenF = first.length();
        int lenS = second.length();
        if( lenF>lenS ) {
            return oneEditAway(second, first);
        } else if( lenF == lenS ) {
            int cnt = 0;
            for(int i=0; i<lenF; i++) {
                if( first.charAt(i)!=second.charAt(i)) {
                    cnt ++;
                }
            }
            return cnt == 1;
        } else {
            int cnt = 0;
            StringBuffer sbF = new StringBuffer(first);
            for(int i=0; i<lenF; i++) {
                if(first.charAt(i)!=second.charAt(i) ) {
                    cnt ++;
                    sbF.insert(i, second.charAt(i));
                    break;
                }
            }
            // 坑点数据: "a"、"ab" 或者 ""、"a"
            if( cnt == 0) {
                return lenS-lenF==1;
            }
            return second.equals(sbF.toString());
        }
    }
}
posted @ 2022-05-13 23:23  Asimple  阅读(22)  评论(0编辑  收藏  举报