一次编辑
题目描述:
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例1:
输入:
first = "pale"
second = "ple"
输出: True
示例2:
输入:
first = "pales"
second = "pal"
输出: False
解题思路:
首先我们得明白一件事情,两个字符串能够通过对方插入一个字符、删除一个字符串或者替换一个字符得来。那么证明他们长度之差一定是小于等于1的,因此我们可以先特判一下只要他们两个的长度差大于1直接返回false。
这里说一个小细节:不管是first字符串长还是second字符串长,我们都让长的字符串是first!!!
然后再来说思路:
经过上面的处理接下来就只要考虑两种情况:
- first字符串与second字符串相等,遍历两个字符串并且用一个变量用来记录他们两个字符串之间有多少个字符不同,只要这个变量大小超过1就直接返回false,因为他们不可能通过替换一个字符得到。如果这个变量的大小是小于等于1的则返回true
- first字符串与second字符串长度的差值为1,遍历两个字符串并且用一个变量来记录他们两个字符串之间有多少个字符不同,这个变量大小如果是小于等于1的,那么first就可以通过second插入一个字符得到或者说second就可以通过first删除一个字符得到。但是这个变量大小只要是大于1的,那么他们俩就一定不能通过一次编辑得到,反之则可以通过一次编辑得到
需要注意的是:当是第二种情况的时候,遍历的时候,如果此时first的字符与second的字符是不相等的,我们要让first后移,而不是second后移,因为有可能first就是比second多了这个字符,并且我们通过变量来记录它俩不同的字符个数也是想知道second字符串的所有字符是否都在first出现过。
代码
class Solution {
public:
bool oneEditAway(string first, string second) {
int n1 = first.size();
int n2 = second.size();
if(n1<n2)
{
swap(first,second);
}
if(abs(n1-n2)>1)
{
return false;
}
if(n1==n2)
{
int sum = 0;
for(int i = 0;i<n1;i++)
{
if(first[i]!=second[i])
{
sum++;
}
}
return sum<=1;
}
else
{
int i = 0;
int j = 0;
int count = 0;
while(i<n1&&j<n2)
{
if(first[i]==second[j])
{
i++;
j++;
}
else
{
count++;
if(count>1)
{
return false;
}
i+=count;
}
}
}
return true;
}
};
|