题目描述

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

示例一

输入: 
first = "pale"
second = "ple"
输出: True

示例二

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

解题分析

  • 如果两个字符串的长度相差大于1,无论怎么编辑都是不可能相等的,可以直接返回false。
  • 如果长度相等,当某个字符不匹配的时候我们标记一下,下次如果再遇到一次不匹配的直接返回false。
  • 如果长度相差1,用longer 表示较长的字符串,shorter 表示较短的字符串,同时遍历两个字符串,比较对应下标处的字符是否相同,如果字符相同则将两个字符串的下标同时加 1,如果字符不同则只将 longer 的下标加 1。下次如果再遇到一次不匹配的直接返回false。

实现代码

public boolean oneEditAway(String first, String second) {
// 如果两个字符串的长度大于1,直接返回false
if (Math.abs(first.length() - second.length()) > 1)
return false;
// 记录有没有匹配失败过
boolean noMath = false;
for (int i = 0, j = 0; i < first.length()
&& j < second.length(); i++, j++) {
// 如果两个字符相同,直接跳过
if (first.charAt(i) == second.charAt(j))
continue;
// 如果之前匹配失败过,直接返回false
if (noMath)
return false;
// 标记匹配失败一次
noMath = true;
// 匹配失败,字符串长的那个字符要跳过,因为在
// for循环中下一步要执行i++和j++,我们只需要
// 让字符串短的减1即可。
if (first.length() > second.length()) {
j--;
} else if (first.length() < second.length()) {
i--;
}
}
return true;
}