LeetCode 面试题 01.05. 一次编辑(C++)
LeetCode 面试题 01.05. 一次编辑
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
点击链接开始刷题φ(゜▽゜*)♪:LeetCode 面试题 01.05. 一次编辑
注:题目来源为 力扣 (LeetCode)
示例1
输入:
first = “pale” second = “ple”
输出: True
示例2
输入:
first = “pales” second = “pal”
输出: False
解题思路
记字符串 first 长度为 m,字符串 second 长度为 n.
- first 和 second 的长度相差大于 1 ,即 |m - n| > 1 ,那编辑次数也会大于 1 ,所以这种情况直接返回 false;
- first 和 second 的长度相差小于等于 1 ,即 |m - n| <= 1 ,那么有三种子情况:
- m < n : 直接调用 oneEditAway(second,first) ,使之变成第三种子情况,即 m > n;
- m = n : 循环对比 first[i] 和 second[i] ,如果不同则 cnt++ ,当 cnt > 1 则返回 false;
- m > n : 循环对比 first[i] 和 second[i - cnt] ,如果不同则 cnt++ ,当 cnt > 1 则返回 false.
代码
class Solution {
public:
bool oneEditAway(string first, string second) {
int m = first.size();
int n = second.size();
int cnt = 0;
if (abs(m - n) > 1)
return false;
if (m < n)
return oneEditAway(second,first);
else if (m == n) {
for (int i = 0; i < m; i++) {
if (first[i] != second[i]) {
cnt++;
if (cnt > 1)
return false;
}
}
}
else {
for (int i = 0;i < m; i++) {
if (first[i] != second[i - cnt]) {
cnt++;
if (cnt > 1)
return false;
}
}
}
return true;
}
};
- 时间复杂度:O(m + n),其中 m 、n 分别为字符串 first 和 second 的长度
- 空间复杂度:O(1)