题目链接:leetcode.
我的反复判断
/*
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6.2 MB, 在所有 C++ 提交中击败了50.34%的用户
*/
class Solution {
public:
bool oneEditAway(string first, string second) {
int M = first.size(), N = second.size();
if(abs(M - N) > 1)
return false;
if(M > N)
{
int flag = 0;
for(int i = 0, j = 0;j < N;)
{
if(first[i] != second[j])
{
i++;
flag++;
}
else
{
i++;
j++;
}
if(flag > 1)
return false;
}
}
else if(M == N)
{
int flag = 0;
for(int i = 0, j = 0;j < N;)
{
if(first[i] != second[j])
{
flag++;
}
i++;
j++;
if(flag > 1)
return false;
}
}
else
{
int flag = 0;
for(int i = 0, j = 0;i < M;)
{
if(first[i] != second[j])
{
j++;
flag++;
}
else
{
i++;
j++;
}
if(flag > 1)
return false;
}
}
return true;
}
};
大佬都太强了吧,俺分四次情况讨论,人家只需要两次
如果两个字符串长度差小于等于1,判断能不能一次修改成功——双指针:
- 让
i
从前往后指到两个字符串第一次不一样的位置 - 让
j
,k
从后往前指到最后一次不一样的地方(j
初始为M-1
,k
为N-1
/*
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6.2 MB, 在所有 C++ 提交中击败了62.76%的用户
*/
class Solution {
public:
bool oneEditAway(string first, string second) {
int M = first.size(), N = second.size();
if(abs(M - N) > 1)
return false;
int i = 0, j = M - 1, k = N - 1;
while(i < M && i < N && first[i] == second[i])
i++;
while(j >= 0 && k >= 0 && first[j] == second[k])
{
j--;
k--;
}
return (j - i) < 1 && (k - i) < 1;
}
};