Skip to content

Commit dcf01b5

Browse files
committedDec 1, 2021
feat: add solutions to lc/lcof2 problems
* Add solutions to lc problem: No.1446.Consecutive Characters * Add solutions to lc/lcof2 problem: Open the Lock
1 parent 99d8939 commit dcf01b5

File tree

15 files changed

+903
-68
lines changed

15 files changed

+903
-68
lines changed
 

‎lcof2/剑指 Offer II 109. 开密码锁/README.md

+147-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565

6666
<p><meta charset="UTF-8" />注意:本题与主站 752&nbsp;题相同:&nbsp;<a href="https://leetcode-cn.com/problems/open-the-lock/">https://leetcode-cn.com/problems/open-the-lock/</a></p>
6767

68-
6968
## 解法
7069

7170
<!-- 这里可写通用的实现逻辑 -->
@@ -77,15 +76,161 @@
7776
<!-- 这里可写当前语言的特殊实现逻辑 -->
7877

7978
```python
80-
79+
class Solution:
80+
def openLock(self, deadends: List[str], target: str) -> int:
81+
s = set(deadends)
82+
if target in s or '0000' in s:
83+
return -1
84+
if target == '0000':
85+
return 0
86+
87+
def prev(c):
88+
return '9' if c == '0' else str(int(c) - 1)
89+
90+
def next(c):
91+
return '0' if c == '9' else str(int(c) + 1)
92+
93+
def get(t):
94+
res = []
95+
t = list(t)
96+
for i in range(4):
97+
c = t[i]
98+
t[i] = prev(c)
99+
res.append(''.join(t))
100+
t[i] = next(c)
101+
res.append(''.join(t))
102+
t[i] = c
103+
return res
104+
105+
visited = set()
106+
q = deque([('0000', 0)])
107+
while q:
108+
status, step = q.popleft()
109+
for t in get(status):
110+
if t in visited or t in s:
111+
continue
112+
if t == target:
113+
return step + 1
114+
q.append((t, step + 1))
115+
visited.add(t)
116+
return -1
81117
```
82118

83119
### **Java**
84120

85121
<!-- 这里可写当前语言的特殊实现逻辑 -->
86122

87123
```java
124+
class Solution {
125+
public int openLock(String[] deadends, String target) {
126+
Set<String> s = new HashSet<>(Arrays.asList(deadends));
127+
if (s.contains(target) || s.contains("0000")) {
128+
return -1;
129+
}
130+
if (Objects.equals(target, "0000")) {
131+
return 0;
132+
}
133+
Set<String> visited = new HashSet<>();
134+
Deque<String> q = new ArrayDeque<>();
135+
q.offerLast("0000");
136+
int step = 0;
137+
while (!q.isEmpty()) {
138+
++step;
139+
for (int i = 0, n = q.size(); i < n; ++i) {
140+
String status = q.pollFirst();
141+
for (String t : get(status)) {
142+
if (visited.contains(t) || s.contains(t)) {
143+
continue;
144+
}
145+
if (Objects.equals(t, target)) {
146+
return step;
147+
}
148+
q.offerLast(t);
149+
visited.add(t);
150+
}
151+
}
152+
}
153+
return -1;
154+
}
155+
156+
private char prev(char c) {
157+
return c == '0' ? '9' : (char) (c - 1);
158+
}
159+
160+
private char next(char c) {
161+
return c == '9' ? '0' : (char) (c + 1);
162+
}
163+
164+
private List<String> get(String t) {
165+
List res = new ArrayList<>();
166+
char[] chars = t.toCharArray();
167+
for (int i = 0; i < 4; ++i) {
168+
char c = chars[i];
169+
chars[i] = prev(c);
170+
res.add(String.valueOf(chars));
171+
chars[i] = next(c);
172+
res.add(String.valueOf(chars));
173+
chars[i] = c;
174+
}
175+
return res;
176+
}
177+
}
178+
```
88179

180+
### **C++**
181+
182+
```cpp
183+
class Solution {
184+
public:
185+
int openLock(vector<string>& deadends, string target) {
186+
unordered_set<string> s(deadends.begin(), deadends.end());
187+
if (s.count(target) || s.count("0000")) return -1;
188+
if (target == "0000") return 0;
189+
unordered_set<string> visited;
190+
queue<string> q;
191+
q.push("0000");
192+
int step = 0;
193+
while (!q.empty())
194+
{
195+
++step;
196+
for (int i = 0, n = q.size(); i < n; ++i)
197+
{
198+
string status = q.front();
199+
q.pop();
200+
for (auto t : get(status))
201+
{
202+
if (visited.count(t) || s.count(t)) continue;
203+
if (t == target) return step;
204+
q.push(t);
205+
visited.insert(t);
206+
}
207+
}
208+
}
209+
return -1;
210+
}
211+
212+
char prev(char c) {
213+
return c == '0' ? '9' : (char) (c - 1);
214+
}
215+
216+
char next(char c) {
217+
return c == '9' ? '0' : (char) (c + 1);
218+
}
219+
220+
vector<string> get(string& t) {
221+
vector<string> res;
222+
for (int i = 0; i < 4; ++i)
223+
{
224+
char c = t[i];
225+
t[i] = prev(c);
226+
res.push_back(t);
227+
t[i] = next(c);
228+
res.push_back(t);
229+
t[i] = c;
230+
}
231+
return res;
232+
}
233+
};
89234
```
90235
91236
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
class Solution {
2+
public:
3+
int openLock(vector<string>& deadends, string target) {
4+
unordered_set<string> s(deadends.begin(), deadends.end());
5+
if (s.count(target) || s.count("0000")) return -1;
6+
if (target == "0000") return 0;
7+
unordered_set<string> visited;
8+
queue<string> q;
9+
q.push("0000");
10+
int step = 0;
11+
while (!q.empty())
12+
{
13+
++step;
14+
for (int i = 0, n = q.size(); i < n; ++i)
15+
{
16+
string status = q.front();
17+
q.pop();
18+
for (auto t : get(status))
19+
{
20+
if (visited.count(t) || s.count(t)) continue;
21+
if (t == target) return step;
22+
q.push(t);
23+
visited.insert(t);
24+
}
25+
}
26+
}
27+
return -1;
28+
}
29+
30+
char prev(char c) {
31+
return c == '0' ? '9' : (char) (c - 1);
32+
}
33+
34+
char next(char c) {
35+
return c == '9' ? '0' : (char) (c + 1);
36+
}
37+
38+
vector<string> get(string& t) {
39+
vector<string> res;
40+
for (int i = 0; i < 4; ++i)
41+
{
42+
char c = t[i];
43+
t[i] = prev(c);
44+
res.push_back(t);
45+
t[i] = next(c);
46+
res.push_back(t);
47+
t[i] = c;
48+
}
49+
return res;
50+
}
51+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
class Solution {
2+
public int openLock(String[] deadends, String target) {
3+
Set<String> s = new HashSet<>(Arrays.asList(deadends));
4+
if (s.contains(target) || s.contains("0000")) {
5+
return -1;
6+
}
7+
if (Objects.equals(target, "0000")) {
8+
return 0;
9+
}
10+
Set<String> visited = new HashSet<>();
11+
Deque<String> q = new ArrayDeque<>();
12+
q.offerLast("0000");
13+
int step = 0;
14+
while (!q.isEmpty()) {
15+
++step;
16+
for (int i = 0, n = q.size(); i < n; ++i) {
17+
String status = q.pollFirst();
18+
for (String t : get(status)) {
19+
if (visited.contains(t) || s.contains(t)) {
20+
continue;
21+
}
22+
if (Objects.equals(t, target)) {
23+
return step;
24+
}
25+
q.offerLast(t);
26+
visited.add(t);
27+
}
28+
}
29+
}
30+
return -1;
31+
}
32+
33+
private char prev(char c) {
34+
return c == '0' ? '9' : (char) (c - 1);
35+
}
36+
37+
private char next(char c) {
38+
return c == '9' ? '0' : (char) (c + 1);
39+
}
40+
41+
private List<String> get(String t) {
42+
List res = new ArrayList<>();
43+
char[] chars = t.toCharArray();
44+
for (int i = 0; i < 4; ++i) {
45+
char c = chars[i];
46+
chars[i] = prev(c);
47+
res.add(String.valueOf(chars));
48+
chars[i] = next(c);
49+
res.add(String.valueOf(chars));
50+
chars[i] = c;
51+
}
52+
return res;
53+
}
54+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution:
2+
def openLock(self, deadends: List[str], target: str) -> int:
3+
s = set(deadends)
4+
if target in s or '0000' in s:
5+
return -1
6+
if target == '0000':
7+
return 0
8+
9+
def prev(c):
10+
return '9' if c == '0' else str(int(c) - 1)
11+
12+
def next(c):
13+
return '0' if c == '9' else str(int(c) + 1)
14+
15+
def get(t):
16+
res = []
17+
t = list(t)
18+
for i in range(4):
19+
c = t[i]
20+
t[i] = prev(c)
21+
res.append(''.join(t))
22+
t[i] = next(c)
23+
res.append(''.join(t))
24+
t[i] = c
25+
return res
26+
27+
visited = set()
28+
q = deque([('0000', 0)])
29+
while q:
30+
status, step = q.popleft()
31+
for t in get(status):
32+
if t in visited or t in s:
33+
continue
34+
if t == target:
35+
return step + 1
36+
q.append((t, step + 1))
37+
visited.add(t)
38+
return -1

0 commit comments

Comments
 (0)