@@ -30,7 +30,23 @@ second = "pal"
3030
3131<!-- 这里可写通用的实现逻辑 -->
3232
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。
3450
3551<!-- tabs:start -->
3652
@@ -42,17 +58,27 @@ second = "pal"
4258class Solution :
4359 def oneEditAway (self , first : str , second : str ) -> bool :
4460 n1, n2 = len (first), len (second)
45- if abs (n1 - n2) > 1 :
61+ diff = n1 - n2
62+ if abs (diff) > 1 :
4663 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
5276 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
5682```
5783
5884### ** Java**
@@ -63,26 +89,63 @@ class Solution:
6389class Solution {
6490 public boolean oneEditAway (String first , String second ) {
6591 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 ) {
6894 return false ;
6995 }
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 ;
78111 }
79- } else {
80- return oneEditAway(first. substring(1 ), second. substring(1 ));
81112 }
113+ return true ;
82114 }
83115}
84116```
85117
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+
86149### **...**
87150
88151```
0 commit comments