LeetCode 刷题—面试题 01.05. 一次编辑

80 阅读1分钟

题目

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

解题思路

  1. 由题可知,需要1次或者0次编辑,且编辑的是字符,所以两个字符串长度必须小于等于1
  2. 先计算两个字符串长度的差值,如果大于1直接false
  3. 然后分类讨论差值为1和差值为0的情况,如果为0,则需要统计不一样的字符数,统计出来count<=1就true
  4. 如果为1,有0个字符和1个字符的情况,直接true,
  5. 如果为1,长字符串的情况,如teacher和treacher,则需要一次对比,将多余的剔除后对比是否一样,一样就true

代码

/**
 * @param {string} first
 * @param {string} second
 * @return {boolean}
 */
var oneEditAway = function (first, second) {
  let len1 = first.length;
  let len2 = second.length;
  let distance = Math.abs(len1 - len2);
  if (distance <= 1) {
    if (distance === 0) {
      let count = 0;
      for (let i = 0; i < first.length; i++) {
        if (first[i] !== second[i]) {
          count++;
        }
      }
      return count <= 1;
    } else if (distance === 1) {
      if (len1 <= 1 || len2 <= 1) {
        return true;
      }
      let str1 = len1 > len2 ? first : second;
      let str2 = len1 < len2 ? first : second;
      for (let i = 0; i < str1.length; i++) {
        if (str1[i] !== str2[i]) {
          return str1.substring(i + 1) === str2.substring(i)
        }
      }
    }
  }
  return false;
};