一次编辑

161 阅读1分钟

1、题目描述

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

示例1:

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

示例2:

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

2、思路

判断是否需要一次编辑就可以使得两个字符串相等,所以首先两个字符串的长度差不能超过1

当需要插入一个字符或者删除一个字符,两个字符串才相等的时候,两个字符串的长度差一定是1,这个时候可以两种情况统一处理,用 longer 表示较长的字符串,horter 表示较短的字符串,同时遍历两个字符串,比较对应下标处的字符是否相同,如果字符相同则将两个字符串的下标同时加 1,如果字符不同则只将 longer 的下标加 1。遍历过程中如果出现两个字符串的下标之差大于1则不符合一次编辑,遍历结束时如果两个字符串的下标之差不大于 1则符合一次编辑。

当 m = n时,同时遍历first和second,比较相同下标处的字符是否相同。如果字符不同的下标个数不超过1,则符合一次编辑或零次编辑。

3、代码实现

class Solution {
    public boolean oneEditAway(String first, String second) {
        int m = first.length();
        int n = second.length();
        if(m-n == 1){
            return oneInsert(first,second);
        }
        else if(n-m == 1){
            return oneInsert(second,first);
        }
        else if(m == n){
            boolean founddifference = false;
            for(int i = 0;i < m;i++){
                if(first.charAt(i) != second.charAt(i)){
                    if(!founddifference){
                        founddifference = true;
                    }
                    else{
                        return false;
                    }
                }
            }
            return true;
        }
        else{
            return false;
        }
    }
    public boolean oneInsert(String longer,String shorter){
        int index1 = 0,index2 = 0;
        int len1 = longer.length(),len2 = shorter.length();
        while(index1 < len1 && index2 < len2){
            if(longer.charAt(index1) == shorter.charAt(index2)){
                index2++;
            }
            index1++;
            if(index1 - index2 > 1){
                return false;
            }
        }
        return true;
    }
}