Skip to content

Commit 7a05fa1

Browse files
committed
feat: update lcci solutions: No.01.05. One Away
1 parent 473f026 commit 7a05fa1

File tree

7 files changed

+218
-66
lines changed

7 files changed

+218
-66
lines changed

lcci/01.03.String to URL/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class Solution {
7575
}
7676
```
7777

78-
### JavaScript
78+
### **JavaScript**
7979

8080
```js
8181
/**

lcci/01.03.String to URL/README_EN.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class Solution {
8484
}
8585
```
8686

87-
### JavaScript
87+
### **JavaScript**
8888

8989
```js
9090
/**

lcci/01.05.One Away/README.md

+85-22
Original file line numberDiff line numberDiff line change
@@ -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 = &quot;pal&quot;
4258
class 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:
6389
class 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
```

lcci/01.05.One Away/README_EN.md

+68-21
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,27 @@ second = &quot;pal&quot;
4444
class Solution:
4545
def oneEditAway(self, first: str, second: str) -> bool:
4646
n1, n2 = len(first), len(second)
47-
if abs(n1 - n2) > 1:
47+
diff = n1 - n2
48+
if abs(diff) > 1:
4849
return False
49-
if n1 + n2 <= 2:
50-
return True
51-
if first[0] != second[0]:
52-
if n1 == n2:
53-
return first[1:] == second[1:]
50+
i, j, op = 0, 0, 1
51+
while i < n1 and j < n2:
52+
not_same = first[i] != second[j]
53+
if not_same:
54+
if diff == 1:
55+
i += 1
56+
elif diff == -1:
57+
j += 1
58+
else:
59+
i += 1
60+
j += 1
61+
op -= 1
5462
else:
55-
return first[1:] == second or second[1:] == first
56-
else:
57-
return self.oneEditAway(first[1:], second[1:])
63+
i += 1
64+
j += 1
65+
if op < 0:
66+
return False
67+
return True
5868
```
5969

6070
### **Java**
@@ -63,26 +73,63 @@ class Solution:
6373
class Solution {
6474
public boolean oneEditAway(String first, String second) {
6575
int n1 = first.length(), n2 = second.length();
66-
int differ = Math.abs(n1 - n2);
67-
if (differ > 1) {
76+
int diff = n1 - n2;
77+
if (Math.abs(diff) > 1) {
6878
return false;
6979
}
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);
80+
int op = 1;
81+
for (int i = 0, j = 0; i < n1 && j < n2; ++i, ++j) {
82+
boolean notSame = first.charAt(i) != second.charAt(j);
83+
if (notSame) {
84+
if (diff == 1) {
85+
// --j, ++i, ++j => ++i
86+
--j;
87+
} else if (diff == -1) {
88+
// --i, ++i, ++j => ++j
89+
--i;
90+
}
91+
--op;
92+
}
93+
if (op < 0) {
94+
return false;
7895
}
79-
} else {
80-
return oneEditAway(first.substring(1), second.substring(1));
8196
}
97+
return true;
8298
}
8399
}
84100
```
85101

102+
### **C++**
103+
104+
```cpp
105+
class Solution {
106+
public:
107+
bool oneEditAway(string first, string second) {
108+
int n1 = first.size(), n2 = second.size();
109+
int diff = n1 - n2;
110+
if (abs(diff) > 1) {
111+
return false;
112+
}
113+
int op = 1;
114+
for (int i = 0, j = 0; i < n1 && j < n2; ++i, ++j) {
115+
bool notSame = first[i] != second[j];
116+
if (notSame) {
117+
if (diff == 1) {
118+
--j;
119+
} else if (diff == -1) {
120+
--i;
121+
}
122+
--op;
123+
}
124+
if (op < 0) {
125+
return false;
126+
}
127+
}
128+
return true;
129+
}
130+
};
131+
```
132+
86133
### **...**
87134
88135
```

lcci/01.05.One Away/Solution.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution {
2+
public:
3+
bool oneEditAway(string first, string second) {
4+
int n1 = first.size(), n2 = second.size();
5+
int diff = n1 - n2;
6+
if (abs(diff) > 1) {
7+
return false;
8+
}
9+
int op = 1;
10+
for (int i = 0, j = 0; i < n1 && j < n2; ++i, ++j) {
11+
bool notSame = first[i] != second[j];
12+
if (notSame) {
13+
if (diff == 1) {
14+
--j;
15+
} else if (diff == -1) {
16+
--i;
17+
}
18+
--op;
19+
}
20+
if (op < 0) {
21+
return false;
22+
}
23+
}
24+
return true;
25+
}
26+
};

lcci/01.05.One Away/Solution.java

+18-12
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
class Solution {
22
public boolean oneEditAway(String first, String second) {
33
int n1 = first.length(), n2 = second.length();
4-
int differ = Math.abs(n1 - n2);
5-
if (differ > 1) {
4+
int diff = n1 - n2;
5+
if (Math.abs(diff) > 1) {
66
return false;
77
}
8-
if (n1 + n2 <= 2) {
9-
return true;
10-
}
11-
if (first.charAt(0) != second.charAt(0)) {
12-
if (n1 == n2) {
13-
return first.substring(1).equals(second.substring(1));
14-
} else {
15-
return first.substring(1).equals(second) || second.substring(1).equals(first);
8+
int op = 1;
9+
for (int i = 0, j = 0; i < n1 && j < n2; ++i, ++j) {
10+
boolean notSame = first.charAt(i) != second.charAt(j);
11+
if (notSame) {
12+
if (diff == 1) {
13+
// --j, ++i, ++j => ++i
14+
--j;
15+
} else if (diff == -1) {
16+
// --i, ++i, ++j => ++j
17+
--i;
18+
}
19+
--op;
20+
}
21+
if (op < 0) {
22+
return false;
1623
}
17-
} else {
18-
return oneEditAway(first.substring(1), second.substring(1));
1924
}
25+
return true;
2026
}
2127
}

lcci/01.05.One Away/Solution.py

+19-9
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
class Solution:
22
def oneEditAway(self, first: str, second: str) -> bool:
33
n1, n2 = len(first), len(second)
4-
if abs(n1 - n2) > 1:
4+
diff = n1 - n2
5+
if abs(diff) > 1:
56
return False
6-
if n1 + n2 <= 2:
7-
return True
8-
if first[0] != second[0]:
9-
if n1 == n2:
10-
return first[1:] == second[1:]
7+
i, j, op = 0, 0, 1
8+
while i < n1 and j < n2:
9+
not_same = first[i] != second[j]
10+
if not_same:
11+
if diff == 1:
12+
i += 1
13+
elif diff == -1:
14+
j += 1
15+
else:
16+
i += 1
17+
j += 1
18+
op -= 1
1119
else:
12-
return first[1:] == second or second[1:] == first
13-
else:
14-
return self.oneEditAway(first[1:], second[1:])
20+
i += 1
21+
j += 1
22+
if op < 0:
23+
return False
24+
return True

0 commit comments

Comments
 (0)