题目

题目来源:力扣(LeetCode)

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


示例 1:

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

示例 2:

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

思路分析

双指针

  1. 双指针遍历,⽤⼀个标记位记录是否编辑过。
  2. 当出现不相等的字符,就给它⼀次编辑的机会,后⾯再出现不相等就返回 false 。
  3. 编辑策略:如果两字符串⻓度相等,就⽤替换是最⼩编辑;不相等的话,⻓度⻓的字符串指针⾛⼀ 步就可以了,相当于字符串⻓的那个删除⼀个字符。
  4. 时间复杂度是 O(N) , 空间复杂度是O(1)。因为双指针是同时动的,⽽且两字符⻓度肯定是相等的或 者只差1才需要⽐较。
  1. /**
  2. * @param {string} first
  3. * @param {string} second
  4. * @return {boolean}
  5. */
  6. var oneEditAway = function (first, second) {
  7. // 因为只有一次编辑的机会,如果两个字符串长度相差大于1,直接返回false
  8. if (Math.abs(first.length - second.length) > 1) return false;
  9. let i = 0;
  10. let j = 0;
  11. let edit = false;
  12. while (i < first.length && j < second.length) {
  13. // 两个字符串从前往后开始遍历,如果字符一样就继续比较下一个
  14. if (first.charAt(i) === second.charAt(j)) {
  15. i++;
  16. j++;
  17. } else {
  18. // 当出现不相等的字符,给予它⼀次编辑的机会,后⾯再出现不相等就返回 false 。
  19. if (!edit) {
  20. if (first.length === second.length) {
  21. // 如果两字符串⻓度相等,就⽤替换是最⼩编辑
  22. i++;
  23. j++;
  24. } else if (first.length < second.length) {
  25. // 不相等的话,⻓度⻓的字符串指针⾛⼀步就可以了,相当于字符串⻓的那个删除⼀个字符。
  26. j++;
  27. } else {
  28. i++;
  29. }
  30. edit = true;
  31. } else {
  32. return false;
  33. }
  34. }
  35. }
  36. return true;
  37. };