题目
题目内容
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
来源:力扣(LeetCode)
示例 1:
输入:
first = “pale”
second = “ple”
输出: True
示例 2:
输入:
first = “pales”
second = “pal”
输出: False
文章目录
- 题目与示例
- 一、思路
- 二、解题代码
一、思路
该题目要求我们返回是否可以通过一次编辑来使first == second,所谓的编辑包括插入一个字符、删除一个字符或者替换一个字符。
由题意易知,first和second字符串之间至多有1处不同时,才能通过一次修改来达到题目要求,所以当两个字符串长度的差值的绝对值比1大时,我们直接返回false即可。
我们使用双指针来解决这个问题,fir_p作为first字符串的指针指向first中的每一个字符,sec_p作为second字符串的指针指向second中的每一个字符。used用于表示当前是否已经使用了一次编辑的机会,如果使用了即为true。
我们分为三种情况进行遍历,当两个字符串长度相等时,指针遇到不一样的内容时,将used设置为true,然后按照顺序访问后面的内容即可;当两个字符串长度不相等时,指针遇到不一样的内容时,将used设置为true,然后让较长字符串的指针后移且保持较短字符串的指针不动。一直遍历到字符串的最后一个元素即可。
如果我们在使用双指针对两个字符串进行遍历的时候,发现used==true的条件下,两个指针所指向的内容也不同时,说明我们需要大于1次的编辑,返回false即可。否则返回true。
解题代码如下:
class Solution {
public:
bool oneEditAway(string first, string second) {
int fir_len = first.length(), sec_len = second.length();
if(abs(fir_len - sec_len) > 1)return false;
bool used = false;//用于表示是否已经使用了一次编辑的机会
int fir_p = 0, sec_p = 0;//指向两个字符串的指针
while(fir_p
if(first[fir_p] != second[sec_p]){
if(used == true) {//当使用过一次编辑机会后,又出现了需要修改的地方
return false;//返回false
}
used = true;
if(fir_len == sec_len){
fir_p++;
sec_p++;
}else if(fir_len < sec_len){
sec_p++;
}else{
fir_p++;
}//对不同情况的字符串进行分类讨论
}else{
fir_p++;
sec_p++;
}
}
return true;
}
};
注:以上部分内容源自力扣,解题方法为个人想法,如有错误还请大家指正



