1、思路
-
看似有三种操作,其实只有两种,插入操作与删除操作都可以视作插入操作,只不过两个字符串的位置不同而已;
-
替换操作的前提是两个字符串长度一致。
2、代码
class Solution {
public:
bool oneEditReplace(string& first, string& second)
{
bool findDifference = false;
for (int i = 0; i < first.length(); ++ i)
{
if (first[i] != second[i])
{
if (findDifference) return false;
findDifference = true;
}
}
return true;
}
//检测是否可以通过向first插入一个字符构造second
bool oneEditInsert(string& first, string& second)
{
int idx1 = 0, idx2 = 0; //用索引来遍历两个字符串
while (idx1 < first.length() && idx2 < second.length())
{
if (first[idx1] != second[idx2]) //遇到不同的字符,second索引+1
{
if (idx1 != idx2) return false; //第二次遇到不同字符,直接返回false
++ idx2;
}
else
{
++ idx1;
++ idx2;
}
}
return true;
}
bool oneEditAway(string first, string second) {
if (first.length() == second.length())
{ //长度一致,执行替换操作
return oneEditReplace(first, second);
}
else if (first.length() + 1 == second.length())
{ //第一个字符串较长,执行删除操作
return oneEditInsert(first, second);
}
else if (first.length() - 1 == second.length())
{ //第一个字符串较短,执行插入操作
return oneEditInsert(second, first);
}
return false;
}
};