1. 题目描述
https://leetcode.cn/problems/one-away-lcci/
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入:
first = “pale”
second = “ple”
输出: True
示例 2:
输入:
first = “pales”
second = “pal”
输出: False
2. 题解
2022-05-13 AC, 咱的想法就是暴力模拟, 大佬的写法就是简洁优雅
<?php/*** Created by PhpStorm* User: jtahstu* Time: 2022/5/13 0:33* Des: 面试题 01.05. 一次编辑* https://leetcode.cn/problems/one-away-lcci/* 字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。*/class Solution{/*** @param String $first* @param String $second* @return Boolean*/function oneEditAway($first, $second){$f_len = strlen($first);$s_len = strlen($second);if (abs($f_len - $s_len) > 1) return false;if ($first == $second) return true;if ($f_len > $s_len) {list($first, $second) = [$second, $first];list($f_len, $s_len) = [$s_len, $f_len];}if (!$first) return true;if ($s_len == $f_len + 1) { //插入或删除字符for ($i = 0; $i < $s_len; $i++) {$s = substr($second, 0, $i) . substr($second, $i + 1, $s_len - $i);echo $s . PHP_EOL;if ($s == $first) {return true;}}} else { //替换字符for ($i = 0; $i < $s_len; $i++) {$s = $second;$s[$i] = $first[$i];if ($s == $first) {return true;}}}return false;}}var_dump((new Solution)->oneEditAway("pale", "pal"));var_dump((new Solution)->oneEditAway("pales", "pal"));var_dump((new Solution)->oneEditAway("a", "b"));/*** 执行用时:8 ms, 在所有 PHP 提交中击败了80.65%的用户* 内存消耗:18.7 MB, 在所有 PHP 提交中击败了41.94%的用户* 通过测试用例:1146 / 1146*///这个写法比较流弊, 都+1是替换, second+1是删除, first+1是插入//class Solution:// def oneEditAway(self, first: str, second: str) -> bool:// m,n=len(first),len(second)// if abs(m-n)>1:// return False// for i in range(min(m,n)):// if first[i]!=second[i]:// return first[i+1:]==second[i+1:] or first[i:]==second[i+1:] or first[i+1:]==second[i:]// return True
