面试题 01.05. 一次编辑
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入:
first = “pale”
second = “ple”
输出: True
示例 2:
输入:
first = “pales”
second = “pal”
输出: False
思路:首先因为只有一次编辑,如果字符串长度差大于1,说明肯定不止一次,可以直接返回错误。接着根据差值情况,可以判断是相等还是哪个字符串多了一个,for循环遍历判断。
/**
* @param {string} first
* @param {string} second
* @return {boolean}
*/
var oneEditAway = function(first, second) {
const flen = first.length;
const slen = second.length;
let count = 0;
if (flen - slen === 0) {
// 说明是替换
for (let i = 0; i < flen; i++) {
if (first[i] !== second[i]) {
if (count === 0) {
count++;
} else {
return false;
}
}
}
} else if (flen - slen === 1) {
for (let i = 0, j = 0; i < flen; i++, j++) {
if (first[i] !== second[j]) {
if (count === 0) {
count++;
--j;
} else {
return false;
}
}
}
} else if (flen - slen === -1) {
for (let i = 0, j = 0; i < flen; i++, j++) {
if (first[j] !== second[i]) {
if (count === 0) {
count++;
--j;
} else {
return false;
}
}
}
} else {
return false;
}
return true;
};
代码优化(虽然运行效率反而降低了,但是代码量少了)
/**
* @param {string} first
* @param {string} second
* @return {boolean}
*/
var oneEditAway = function(first, second) {
const flen = first.length;
const slen = second.length;
const len = flen - slen;
let count = 0;
if (len > 1 || len < -1) {
return false;
}
for (let i = 0, j = 0; i < flen && j < slen; i++, j++) {
if (first[i] != second[j]) {
if (len === 1) {
j--;
} else if (len === -1) {
i--;
}
count++;
}
if (count > 1) {
return false;
}
}
return true;
};