javascript解力扣面试题 01.05. 一次编辑

面试题 01.05. 一次编辑

题目描述

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

示例 1:

输入: 
first = "pale"
second = "ple"
输出: True
 
示例 2:

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

解答

var oneEditAway = 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) {
        return false;
    }
    if (m === n) {
        let diff = 0;
        for(let i in first) {
            if (first[i] !== second[i]) {
                ++diff;
            }
        }
        if (diff <= 1) return true;
        else return false;
    }
    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)) {
                    return false;
                }
            }
        }
        return true;
    }

    // 解法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) {
        return false;
    }
    let isEdit = false, i = 0, j = 0;
    while (i < m && j < n) {
        if (first[i++] !== second[j++]) {
            if (isEdit) return false;
            isEdit = true;
            // 如果长度不同时,要把短的拉回到原来位置比较,不能比较短的下一个字符
            if (m !== n) 
                m > n ? j-- : i--;
        }
    }
    return true;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值