Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit dcf01b5

Browse files
committed
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‎

Lines changed: 147 additions & 2 deletions
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
### **...**
Lines changed: 51 additions & 0 deletions
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+
};
Lines changed: 54 additions & 0 deletions
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+
}
Lines changed: 38 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /