@@ -30,7 +30,23 @@ second = "pal"
30
30
31
31
<!-- 这里可写通用的实现逻辑 -->
32
32
33
- 遍历两个字符串,逐个字符比较判断。
33
+ 双指针。
34
+
35
+ 先判断两字符串长度差 ` diff ` 是否大于 1,若是直接返回 false。
36
+
37
+ 接着开始遍历两字符串。若两个指针 ` i ` , ` j ` 所指向的字符 ` first[i] ` 与 ` second[j] ` 不相同:
38
+
39
+ - 若 ` diff == 1 ` ,则 ` i++ `
40
+ - 若 ` diff == -1 ` ,则 ` j++ `
41
+ - 若 ` diff == 0 ` ,则 ` i++ ` , ` j++ `
42
+
43
+ 同时编辑次数 ` op ` 减 1。
44
+
45
+ 若两个指针 ` i ` , ` j ` 所指向的字符相同,则 ` i++ ` , ` j++ ` 。
46
+
47
+ 判断剩余编辑次数是否小于 0,若是,说明不满足一次编辑条件,直接返回 false。
48
+
49
+ 遍历结束,直接返回 true。
34
50
35
51
<!-- tabs:start -->
36
52
@@ -42,17 +58,27 @@ second = "pal"
42
58
class Solution :
43
59
def oneEditAway (self , first : str , second : str ) -> bool :
44
60
n1, n2 = len (first), len (second)
45
- if abs (n1 - n2) > 1 :
61
+ diff = n1 - n2
62
+ if abs (diff) > 1 :
46
63
return False
47
- if n1 + n2 <= 2 :
48
- return True
49
- if first[0 ] != second[0 ]:
50
- if n1 == n2:
51
- return first[1 :] == second[1 :]
64
+ i, j, op = 0 , 0 , 1
65
+ while i < n1 and j < n2:
66
+ not_same = first[i] != second[j]
67
+ if not_same:
68
+ if diff == 1 :
69
+ i += 1
70
+ elif diff == - 1 :
71
+ j += 1
72
+ else :
73
+ i += 1
74
+ j += 1
75
+ op -= 1
52
76
else :
53
- return first[1 :] == second or second[1 :] == first
54
- else :
55
- return self .oneEditAway(first[1 :], second[1 :])
77
+ i += 1
78
+ j += 1
79
+ if op < 0 :
80
+ return False
81
+ return True
56
82
```
57
83
58
84
### ** Java**
@@ -63,26 +89,63 @@ class Solution:
63
89
class Solution {
64
90
public boolean oneEditAway (String first , String second ) {
65
91
int n1 = first. length(), n2 = second. length();
66
- int differ = Math . abs( n1 - n2) ;
67
- if (differ > 1 ) {
92
+ int diff = n1 - n2;
93
+ if (Math . abs(diff) > 1 ) {
68
94
return false ;
69
95
}
70
- if (n1 + n2 <= 2 ) {
71
- return true ;
72
- }
73
- if (first. charAt(0 ) != second. charAt(0 )) {
74
- if (n1 == n2) {
75
- return first. substring(1 ). equals(second. substring(1 ));
76
- } else {
77
- return first. substring(1 ). equals(second) || second. substring(1 ). equals(first);
96
+ int op = 1 ;
97
+ for (int i = 0 , j = 0 ; i < n1 && j < n2; ++ i, ++ j) {
98
+ boolean notSame = first. charAt(i) != second. charAt(j);
99
+ if (notSame) {
100
+ if (diff == 1 ) {
101
+ // --j, ++i, ++j => ++i
102
+ -- j;
103
+ } else if (diff == - 1 ) {
104
+ // --i, ++i, ++j => ++j
105
+ -- i;
106
+ }
107
+ -- op;
108
+ }
109
+ if (op < 0 ) {
110
+ return false ;
78
111
}
79
- } else {
80
- return oneEditAway(first. substring(1 ), second. substring(1 ));
81
112
}
113
+ return true ;
82
114
}
83
115
}
84
116
```
85
117
118
+ ### ** C++**
119
+
120
+ ``` cpp
121
+ class Solution {
122
+ public:
123
+ bool oneEditAway(string first, string second) {
124
+ int n1 = first.size(), n2 = second.size();
125
+ int diff = n1 - n2;
126
+ if (abs(diff) > 1) {
127
+ return false;
128
+ }
129
+ int op = 1;
130
+ for (int i = 0, j = 0; i < n1 && j < n2; ++i, ++j) {
131
+ bool notSame = first[ i] != second[ j] ;
132
+ if (notSame) {
133
+ if (diff == 1) {
134
+ --j;
135
+ } else if (diff == -1) {
136
+ --i;
137
+ }
138
+ --op;
139
+ }
140
+ if (op < 0) {
141
+ return false;
142
+ }
143
+ }
144
+ return true;
145
+ }
146
+ };
147
+ ```
148
+
86
149
### **...**
87
150
88
151
```
0 commit comments