1、题目描述
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例1:
输入:
first = "pale"
second = "ple"
输出: True
示例2:
输入:
first = "pales"
second = "pal"
输出: False
2、思路
判断是否需要一次编辑就可以使得两个字符串相等,所以首先两个字符串的长度差不能超过1
当需要插入一个字符或者删除一个字符,两个字符串才相等的时候,两个字符串的长度差一定是1,这个时候可以两种情况统一处理,用 longer 表示较长的字符串,horter 表示较短的字符串,同时遍历两个字符串,比较对应下标处的字符是否相同,如果字符相同则将两个字符串的下标同时加 1,如果字符不同则只将 longer 的下标加 1。遍历过程中如果出现两个字符串的下标之差大于1则不符合一次编辑,遍历结束时如果两个字符串的下标之差不大于 1则符合一次编辑。
当 m = n时,同时遍历first和second,比较相同下标处的字符是否相同。如果字符不同的下标个数不超过1,则符合一次编辑或零次编辑。
3、代码实现
class Solution {
public boolean oneEditAway(String first, String second) {
int m = first.length();
int n = second.length();
if(m-n == 1){
return oneInsert(first,second);
}
else if(n-m == 1){
return oneInsert(second,first);
}
else if(m == n){
boolean founddifference = false;
for(int i = 0;i < m;i++){
if(first.charAt(i) != second.charAt(i)){
if(!founddifference){
founddifference = true;
}
else{
return false;
}
}
}
return true;
}
else{
return false;
}
}
public boolean oneInsert(String longer,String shorter){
int index1 = 0,index2 = 0;
int len1 = longer.length(),len2 = shorter.length();
while(index1 < len1 && index2 < len2){
if(longer.charAt(index1) == shorter.charAt(index2)){
index2++;
}
index1++;
if(index1 - index2 > 1){
return false;
}
}
return true;
}
}