难度: 中等 | 标签: 字符串 双指针

1. 题目描述

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

示例 1:
输入:
first = “pale”
second = “ple”
输出: True
示例 2:
输入:
first = “pales”
second = “pal”
输出: False

通过次数: 44,201 | 提交次数: 136,132

2. 题解

2022-05-13 AC, 咱的想法就是暴力模拟, 大佬的写法就是简洁优雅

  1. <?php
  2. /**
  3. * Created by PhpStorm
  4. * User: jtahstu
  5. * Time: 2022/5/13 0:33
  6. * Des: 面试题 01.05. 一次编辑
  7. * https://leetcode.cn/problems/one-away-lcci/
  8. * 字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
  9. */
  10. class Solution
  11. {
  12. /**
  13. * @param String $first
  14. * @param String $second
  15. * @return Boolean
  16. */
  17. function oneEditAway($first, $second)
  18. {
  19. $f_len = strlen($first);
  20. $s_len = strlen($second);
  21. if (abs($f_len - $s_len) > 1) return false;
  22. if ($first == $second) return true;
  23. if ($f_len > $s_len) {
  24. list($first, $second) = [$second, $first];
  25. list($f_len, $s_len) = [$s_len, $f_len];
  26. }
  27. if (!$first) return true;
  28. if ($s_len == $f_len + 1) { //插入或删除字符
  29. for ($i = 0; $i < $s_len; $i++) {
  30. $s = substr($second, 0, $i) . substr($second, $i + 1, $s_len - $i);
  31. echo $s . PHP_EOL;
  32. if ($s == $first) {
  33. return true;
  34. }
  35. }
  36. } else { //替换字符
  37. for ($i = 0; $i < $s_len; $i++) {
  38. $s = $second;
  39. $s[$i] = $first[$i];
  40. if ($s == $first) {
  41. return true;
  42. }
  43. }
  44. }
  45. return false;
  46. }
  47. }
  48. var_dump((new Solution)->oneEditAway("pale", "pal"));
  49. var_dump((new Solution)->oneEditAway("pales", "pal"));
  50. var_dump((new Solution)->oneEditAway("a", "b"));
  51. /**
  52. * 执行用时:8 ms, 在所有 PHP 提交中击败了80.65%的用户
  53. * 内存消耗:18.7 MB, 在所有 PHP 提交中击败了41.94%的用户
  54. * 通过测试用例:1146 / 1146
  55. */
  56. //这个写法比较流弊, 都+1是替换, second+1是删除, first+1是插入
  57. //class Solution:
  58. // def oneEditAway(self, first: str, second: str) -> bool:
  59. // m,n=len(first),len(second)
  60. // if abs(m-n)>1:
  61. // return False
  62. // for i in range(min(m,n)):
  63. // if first[i]!=second[i]:
  64. // return first[i+1:]==second[i+1:] or first[i:]==second[i+1:] or first[i+1:]==second[i:]
  65. // return True