字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入:
first ="pale"
second ="ple"
输出: True
示例 2:
输入:
first ="pales"
second ="pal"
输出: False
解答
varoneEditAway=function(first, second){
// 解法1:两种情况分类:①长度相等,只能有一个位置不同,// ②长度差一个,长的字符串只能比短的多一个字符,可以通过找到异常处看后面子串是否相同// 执行用时:92 ms, 在所有 JavaScript 提交中击败了42.64%的用户// 内存消耗:39.5 MB, 在所有 JavaScript 提交中击败了25.64%的用户const m = first.length, n = second.length;if(Math.abs(m - n)>1){
returnfalse;}if(m === n){
let diff =0;for(let i in first){
if(first[i]!== second[i]){
++diff;}}if(diff <=1)returntrue;elsereturnfalse;}else{
if(m < n){
let tmp = first;
first = second;
second = tmp;}for(let i =0; i < first.length -1; i++){
if(first[i]!== second[i]){
if(first.substring(i +1)!== second.substring(i)){
returnfalse;}}}returntrue;}// 解法2:把解法1中的substring判断不同,改成遇到不同跳过下一个// 执行用时:88 ms, 在所有 JavaScript 提交中击败了59.90%的用户// 内存消耗:39.3 MB, 在所有 JavaScript 提交中击败了46.70%的用户const m = first.length, n = second.length;if(Math.abs(m - n)>1){
returnfalse;}let isEdit =false, i =0, j =0;while(i < m && j < n){
if(first[i++]!== second[j++]){
if(isEdit)returnfalse;
isEdit =true;// 如果长度不同时,要把短的拉回到原来位置比较,不能比较短的下一个字符if(m !== n)
m > n ? j--: i--;}}returntrue;};