题目
字符串有三种编辑操作:插入一个英文字符、删除一个英文字符或者替换一个英文字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入:
first = "pale"
second = "ple"
输出: True
1
2
3
4
2
3
4
示例 2:
输入:
first = "pales"
second = "pal"
输出: False
1
2
3
4
2
3
4
题解
java
public boolean oneEditAway(String first, String second) {
int firstLen = first.length(), secondLen = second.length();
// 长度都小于1
if (firstLen <= 1 && secondLen <= 1) {
return true;
}
// 长度相差超过1
if (Math.abs(firstLen - secondLen) > 1) {
return false;
}
// 保证第一个字符串为较短的字符串
if (firstLen > secondLen) {
firstLen ^= secondLen;
secondLen ^= firstLen;
firstLen ^= secondLen;
String temp = first;
first = second;
second = temp;
}
int i = 0, j = 0, flag = 1;
// 双指针遍历
while (i < firstLen && j < secondLen) {
// 字符相同
if (first.charAt(i) == second.charAt(j)) {
i++;
j++;
} else {
// 长度相同 则都进一位表示 替换字符操作
if (firstLen == secondLen) {
i++;
}
// 长度不同 跳过长字符串一次 这里可看做插入或删除字符操作
j++;
// 编辑次数减少
flag--;
}
// 编辑次数大于1次
if (flag < 0) {
return false;
}
}
return true;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48