面试题 01.05. 一次编辑https://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);
}
*/