LeetCode 面试题 01.05. 一次编辑

题目描述

面试题 01.05. 一次编辑

思路分析

解法一:双指针一次遍历(推荐)

核心思路

  • 两字符串长度差大于 1,直接返回 false。
  • 用双指针遍历,遇到不同字符时:
    • 若已发生过编辑,返回 false。
    • 根据长度关系,跳过一个字符(替换或插入/删除)。
  • 最后允许剩余一个字符差异。


复杂度分析

  • 时间复杂度:O(n),其中 n 为较短字符串长度。
  • 空间复杂度:O(1)。
class Solution {
    public boolean oneEditAway(String first, String second) {
        int m = first.length();
        int n = second.length();
        if (Math.abs(m - n) > 1) {
            return false;
        }

        int i = 0;
        int j = 0;
        int edits = 0;

        while (i < m && j < n) {
            if (first.charAt(i) == second.charAt(j)) {
                i++;
                j++;
                continue;
            }

            if (edits == 1) {
                return false;
            }
            edits++;

            if (m == n) {
                i++;
                j++;
            } else if (m > n) {
                i++;
            } else {
                j++;
            }
        }

        return true;
    }
}
func oneEditAway(first string, second string) bool {
	m, n := len(first), len(second)
	if m-n > 1 || n-m > 1 {
		return false
	}

	i, j := 0, 0
	edits := 0
	for i < m && j < n {
		if first[i] == second[j] {
			i++
			j++
			continue
		}

		if edits == 1 {
			return false
		}
		edits++

		if m == n {
			i++
			j++
		} else if m > n {
			i++
		} else {
			j++
		}
	}

	return true
}

相似题目

题目 难度 考察点
72. 编辑距离 困难 DP
161. 相隔为 1 的编辑距离 中等 双指针
583. 两个字符串的删除操作 中等 DP
392. 判断子序列 简单 双指针
680. 验证回文串 II 简单 双指针
409. 最长回文串 简单 计数
本文作者:
本文链接: https://hgnulb.github.io/blog/2023/16636749
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!