一、题目介绍
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入:
first = "pale"
second = "ple"
输出: True
示例 2:
输入:
first = "pales"
second = "pal"
输出: False
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/one-away-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
本题采用双指针法,具体情况如下:
- 两个字符串的长度之差不能大于1。
- 当first[i] == second[j]时,则i++, j++。
- 当first[i] != second[j]时,如果first[i+1] == second[j] ,则i++,count++(编辑次数);如果first[i] == second[j+1],则j++,count++;即可以通过删除一个字符操作,使两个字符串相同。
- 其他情况下,i++,j++,count++,即可以通过插入或者替换一个字符操作,使两个字符串相同。
- 最后当i或j中某个指针,指向first或者second字符串的结尾时,统计max(first.size()-i, second.size()-j) + count的值,如果小于等于1返回true,否则返回false。
三、解题代码
class Solution {
public:
bool oneEditAway(string first, string second) {
int len1 = first.size();
int len2 = second.size();
if(abs(len1-len2) > 1)
return false;
int i = 0, j = 0;
int count = 0;
while(i < len1 && j < len2)
{
if(first[i] == second[j])
{
++i;
++j;
}
else
{
//删除一个字符
if(first[i+1] == second[j])
++i;
//删除一个字符
else if(first[i] == second[j+1])
++j;
//插入一个字符,或者替换一个字符
else
{
++i;
++j;
}
++count;
}
}
if(max(len1-i, len2-j)+count > 1)//当某一个指针先到达字符串结尾时,即两个字符串长度不一致的情况
return false;
return true;
}
};