面试题 01.05. 一次编辑

面试题 01.05. 一次编辑icon-default.png?t=N2N8https://leetcode.cn/problems/one-away-lcci/

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

示例 1:

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

示例 2:

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

题解:

有这样几种情况:
    1、当原本的字符串长度和新字符串的长度相差达到2个及以上时,返回false
    2、原本字符串和新字符串的长度相差在1个及以下时,又可细分几种情况:
        ①相差一个:
            只是在原有的字符串上删除或添加了一个——true
            在原有字符串上删除或添加了一个的同时,改变了一个字符——false
        ②长度相等:
            与原来字符串完全相同——true
            改变了一个字符——ture
            改变了不止一个字符——false

/**
 * @param {string} first
 * @param {string} second
 * @return {boolean}
 */
const first = "pale";
const second = "ple";
var oneEditAway = function (first, second) {
  if (first.length - second.length >= 2) {
    return false;
  }
  if (first == second) {
    return true;
  }
  let flag = 0;
  if (first.length == second.length) {//在字符串长度相等的情况下,通过flag顺序找出有几个不同的地方,超过1个就返回false;
    for (let i = 0; i < first.length; i++) {
      if (first[i] != second[i]) {
        flag++;
      }
    }
    if (flag <= 1) {
      return true;
    } else {
      return false;
    }
  } else {
    let s1 = first.length > second.length ? first : second;
    let s2 = first.length < second.length ? first : second;
    //保证s1始终都是更长的那一个字符串
    for (let i = 0; i < s1.length; i++) {
      if (s1[i] != s2[i]) {
        //通过循环找出不相等的字符所在位置,再刨去这个位置从后一位开始起比较,如果完全相同的话,那么这个字符串就只经过了一次编辑(也就是说只有一个地方不同),否则就是直接返回false,因为有不止一个地方不同
        return s1.substring(i + 1) == s2.substring(i);
      }
    }
  }
  return false;
};
oneEditAway(first, second);
/*
这里试图通过字符串相减来做,在面对减少一个字符的情况下就不行了
let fir = first.split("");
  let sec = second.split("");
  let max = 0;
  if (fir.length >= sec.length) {
    max = fir.length;
  } else {
    max = sec.length;
  }
  let thi = [];
  for (let i = 0; i < max; i++) {
    thi.push(Math.abs(fir[i].charCodeAt() - sec[i].charCodeAt()));
  }
  console.log(thi);
*/
/*
这里想使用map来统计每个字符出现的次数来判断做了什么操作,但是这里的字符串时讲究字符顺序的,所以简单的统计是行不通的
let arr = [];
  let t = 0;
  let array = (first + second).split("");
  console.log(array);
  let maps = new Map();
  for (const item of array) {
    maps.set(item, (maps.get(item) || 0) + 1);
  }
  for (const [v, k] of maps) {
    arr.push(k);
  }

  console.log(maps);
  console.log("arr:", arr);
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] == 1) {
      t++;
    }
  }
  if (t > 2) {
    console.log(false);
  } else {
    console.log(true);
  }
*/

你可能感兴趣的:(leetcode,算法)