首先,给出题目:
![](https://i-blog.csdnimg.cn/blog_migrate/a4a9dac5d5770e7582e627cc3384224b.png)
这道题的思路是比较简单的 通过题目信息我们可以知道这两个字符串的长度像相差只能是1或0 这才有他们可能通过一次操作完成的可能性
然后我们可以分为以下三种情况:
![](https://i-blog.csdnimg.cn/blog_migrate/5cffff8c64ff94c4e60ed3f7eb3de8ae.png)
这个时候我们可以就很自然的想到了双指针 我们可以比较first和second里的相同下标元素的大小 如若first[i]和second[j]不同dif++ 不过在第二种情况下 我们的second就需要暂时保持不动
详见代码:
class Solution {
public:
bool oneEditAway(string first, string second) {
const int M = first.size();
const int N = second.size();
if (M > N + 1 || N > M + 1) return false;
if (N == M + 1) {
return oneEditAway(second, first);//这个是情况三 将first和second进行交换进而减小计算量
}
int i = 0, j = 0;
int diff = 0;
while (i < M && j < N) {
if (first[i] != second[j]) {
diff ++;
if (diff >= 2) {
return false;
}
if (M > N) {
j --;
}
}
i ++;
j ++;
}
return true;
}
};
警示:要记住string类的自定义类型是可以通过类.size()直接计算出类中的字符串的长度的 不要跟个啥子一样 用迭代器遍历求出长度
2023-03-09