题目

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

示例 1:

输入:
first = “pale”
second = “ple”
输出: True

示例 2:

输入:
first = “pales”
second = “pal”
输出: False

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/one-away-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

首先,两个字符串长度相差大于1肯定返回false。

然后,同时遍历两个字符串,记录不同的字符数,遇到不同的字符时,根据两个字符串的长度关系进行下一步操作:

如果长度相等,那么接着遍历;

如果不同,说明一长一短,且相差1,如果满足题意,必须是删除长度较长的字符串当前字符后,两个串应该相同,那么跳过该字符,后面的字符应该完全相同。实现上,因为每一轮都会两个指针++,那么将较短字符串的指针—,然后再一起++,剩下需要比较的字符个数就一样多了。如果出现不同的字符数大于1,返回false,否则返回true。

代码

  1. class Solution {
  2. public boolean oneEditAway(String first, String second) {
  3. int n = first.length();
  4. int m = second.length();
  5. if (n - m > 1 || m - n > 1) {
  6. return false;
  7. }
  8. int diff = 0;
  9. int i = 0;
  10. int j = 0;
  11. while (i < n && j < m) {
  12. if (first.charAt(i) != second.charAt(j)) {
  13. diff++;
  14. if (diff >= 2) {
  15. return false;
  16. }
  17. if (n > m) {
  18. j--;
  19. }
  20. if (m > n) {
  21. i--;
  22. }
  23. }
  24. i++;
  25. j++;
  26. }
  27. return true;
  28. }
  29. }