一次编辑
开始想使用链表解决,发现替换的操作不容易操作。这个数组的splice方法确实很有帮助。
代码:
/**
* @param {string} first
* @param {string} second
* @return {boolean}
*/
var oneEditAway = function(first, second) {
var diff =first.length-second.length
if(Math.abs(diff)>1){
return false
}
var maxLength = diff>0?first.length:second.length
var fArray = Array.from(first)
var sArray = Array.from(second)
for(var i =0;i<maxLength;i++){
if(fArray[i]!==sArray[i]){
if(diff===0){
sArray.splice(i,1,fArray[i])
}else if(diff>0){
sArray.splice(i,0,fArray[i])
}else{
fArray.splice(i,0,sArray[i])
}
break;
}
}
return fArray.join() === sArray.join()
};
先将字符串变成数组。
使用math.abs是一种好的想法
判断插入是一个字符的条件
相差零个字符的话就用splice替换(全部替换)(这一点没有想到)
最后要判断一次字符串是否相等
改进的思路
1.长度相同,判断两个字符串对位是否相同,记录不同次数,次数小于等于1则返回true;
2.长度差一位,先用循环找出长字符串和短字符串开始出现不同的位置,在长字符串中截取不包括该位置的后面部分与短字符串包括该位置的后面部分进行比较,相同返回true。
双指针也是一个很好的想法
var oneEditAway = function (first, second) {
if (first === second) {
return true
}
let len1 = first.length
let len2 = second.length
let num = Math.abs(len1 - len2)
if (num > 1) {
return false
}
let i = 0, j = len1 - 1, k = len2 - 1
while(i<len1 && i<len2 && first[i]===second[i]){
console.log("A1:",i,first[i],second[i])
++i;
console.log("A2:",i,first[i],second[i])
}
while(j>-1 && k>-1 && first[j] === second[k]){
console.log("B1:",j,k,first[j],second[k])
--j;
--k;
console.log("B2:",j,k,first[j],second[k])
}
return j-i<1 && k-i<1;
};