程序员面试金典 05 一次编辑

94 阅读1分钟

题目描述

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

示例 1:
输入:
first = "pale"
second = "ple"
输出: True

示例 2:
输入:
first = "pales"
second = "pal"
输出: False

解题思路1:

这个题目没有太大难度, 主要是需要处理不同的情况.

  1. 直接判断2个字符串是否相等, 直接返回
  2. 判断2个字符串的长度差是否大于1, 直接返回
  3. 对于长度差在1以内的, 我们就需要进行遍历了.
  1. 两个字符串分别从头开始遍历, 如果当前2个字符相等, 那么就往下进行.
    • 如果当前2个字符不相等, 首先记录一次不等count;
    • 然后就需要考虑2个字符串的长度, 如果长度相同表示只存在替换字符的情况, 所以i,j同时+1, 继续遍历;
    • 如果两个字符串长度不相等, 那么就存在长字符串删除和短字符串插入2种情况, 我们将遍历长字符串的idx+1, 用长字符串的下一个字符与短字符串的当前字符进行比较
  2. 当遍历完成后, 如果我们记录的不等count就是要使2个字符串相等需要操作的次数

示例代码

def oneEditAway(self, first: str, second: str) -> bool:
    if first == second: return True
    if abs(len(first) - len(second)) > 1: return False

    l1, l2 = len(first), len(second)
    i, j, count = 0, 0, 0
    
    while i < l1 and j < l2:
        if first[i] == second[j]:
            i += 1
            j += 1
        else:
            count += 1
            if l1 > l2:
                i += 1
            elif l1 == l2:
                i += 1
                j += 1
            else:
                j += 1
    return count < 2