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;
};

おすすめ

転載: blog.csdn.net/weixin_44495869/article/details/121481723