一次编辑

题目描述

来源于 https://leetcode-cn.com/

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

示例 1:

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

示例 2:

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

解法:

此题可以先计算出编辑距离,然后判断编辑距离是否大于 1。但在此处,杀鸡就不用牛刀了。

如果字符串长度之差大于 1,一次编辑肯定不行。从头比较两个字符串,当字符不同时,有两种情况:

  • 两个字符串长度差异为 0:这必然需要一个替换操作,此时增加编辑距离,指向两个字符串的指针均后移一位。
  • 长度差异为 1:这必然需要替换或者插入操作,无论是哪种操作,都可以让较长的字符串的指针后移一位。

在遍历过程中,一旦发现编辑距离大于 1,则可立即返回。

class Solution {
public:
    bool oneEditAway(string first, string second) {
        if(first.size() < second.size()){
            swap(first, second);
        }
        int len_diff = first.size() - second.size();
        if(len_diff > 1){
            return false;
        }

        int edit_distance = 0; 
        for (int i=0, j = 0; i < first.size(); i++, j++){
            if(first[i] != second[j]){
                edit_distance++;
                if(edit_distance > 1){
                    return false;
                }
                if(len_diff == 1){
                    j--;
                    len_diff = 0;
                }
            }
        }
        return true;
    }
};