题目
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入:
first = "pale"
second = "ple"
输出: True
示例 2:
输入:
first = "pales"
second = "pal"
输出: False
思路
对于是否满足题目要求的操作,分下面三种情况:
1、first.len < second.len 只需要考虑 first加一个字符能否变成 second
2、first.len = second.len 考虑 first和second是否只有一个或者0个字符不同,而如果是0个字符不同,其实就是 first=second
3、first.len > second.len 把second和first换一个位置,其实就是情况1
故,其实真实的判断就只要写两种,一种是两者长度相等的时候,判断first和second之前是否相差一个字符,另一种是判断短的字符串first加一个字符后能否变成second。
AC代码
点击查看代码
class Solution {
public boolean oneEditAway(String first, String second) {
if( first.equals(second) ) {
return true;
}
int lenF = first.length();
int lenS = second.length();
if( lenF>lenS ) {
return oneEditAway(second, first);
} else if( lenF == lenS ) {
int cnt = 0;
for(int i=0; i<lenF; i++) {
if( first.charAt(i)!=second.charAt(i)) {
cnt ++;
}
}
return cnt == 1;
} else {
int cnt = 0;
StringBuffer sbF = new StringBuffer(first);
for(int i=0; i<lenF; i++) {
if(first.charAt(i)!=second.charAt(i) ) {
cnt ++;
sbF.insert(i, second.charAt(i));
break;
}
}
// 坑点数据: "a"、"ab" 或者 ""、"a"
if( cnt == 0) {
return lenS-lenF==1;
}
return second.equals(sbF.toString());
}
}
}