Skip to content

Commit 8a3450a

Browse files
committed
feat: add solutions to lc problem: No.0753
No.0753.Cracking the Safe
1 parent c4a9118 commit 8a3450a

File tree

6 files changed

+269
-2
lines changed

6 files changed

+269
-2
lines changed

solution/0700-0799/0753.Cracking the Safe/README.md

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,119 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51+
**方法一:欧拉回路**
52+
53+
我们可以对题目中所描述的内容构建有向图:将每个点看作一个长度为 $n-1$ 的 $k$ 字符串,每条边都带有一个从 $0$ 到 $k-1$ 的字符。如果点 $u$ 到点 $v$ 之间有一条有向边 $e$,假设 $e$ 携带的字符为 $c$,那么 $u+c$ 的末尾 $k-1$ 个字符形成的字符串等于 $v$,此时边 $u+c$ 就表示了一个长度为 $n$ 的密码。
54+
55+
在这个有向图中,一共有 $k^{n-1}$ 个点,每个点都有 $k$ 条出边,也有 $k$ 条入边,因此,该有向图存在欧拉回路,欧拉回路所经过的路径拼接起来就是题目中的答案。
56+
57+
时间复杂度 $O(k^n)$,空间复杂度 $O(k^n)$。
58+
5159
<!-- tabs:start -->
5260

5361
### **Python3**
5462

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

5765
```python
58-
66+
class Solution:
67+
def crackSafe(self, n: int, k: int) -> str:
68+
def dfs(u):
69+
for x in range(k):
70+
e = u * 10 + x
71+
if e not in vis:
72+
vis.add(e)
73+
v = e % mod
74+
dfs(v)
75+
ans.append(str(x))
76+
77+
mod = 10 ** (n - 1)
78+
vis = set()
79+
ans = []
80+
dfs(0)
81+
ans.append("0" * (n - 1))
82+
return "".join(ans)
5983
```
6084

6185
### **Java**
6286

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

6589
```java
90+
class Solution {
91+
private Set<Integer> vis = new HashSet<>();
92+
private StringBuilder ans = new StringBuilder();
93+
private int mod;
94+
95+
public String crackSafe(int n, int k) {
96+
mod = (int) Math.pow(10, n - 1);
97+
dfs(0, k);
98+
ans.append("0".repeat(n - 1));
99+
return ans.toString();
100+
}
101+
102+
private void dfs(int u, int k) {
103+
for (int x = 0; x < k; ++x) {
104+
int e = u * 10 + x;
105+
if (vis.add(e)) {
106+
int v = e % mod;
107+
dfs(v, k);
108+
ans.append(x);
109+
}
110+
}
111+
}
112+
}
113+
```
114+
115+
### **C++**
116+
117+
```cpp
118+
class Solution {
119+
public:
120+
string crackSafe(int n, int k) {
121+
unordered_set<int> vis;
122+
int mod = pow(10, n - 1);
123+
string ans;
124+
function<void(int)> dfs = [&](int u) {
125+
for (int x = 0; x < k; ++x) {
126+
int e = u * 10 + x;
127+
if (!vis.count(e)) {
128+
vis.insert(e);
129+
dfs(e % mod);
130+
ans += (x + '0');
131+
}
132+
}
133+
};
134+
dfs(0);
135+
ans += string(n - 1, '0');
136+
return ans;
137+
}
138+
};
139+
```
66140
141+
### **Go**
142+
143+
```go
144+
func crackSafe(n int, k int) string {
145+
mod := int(math.Pow(10, float64(n-1)))
146+
vis := map[int]bool{}
147+
ans := &strings.Builder{}
148+
var dfs func(int)
149+
dfs = func(u int) {
150+
for x := 0; x < k; x++ {
151+
e := u*10 + x
152+
if !vis[e] {
153+
vis[e] = true
154+
v := e % mod
155+
dfs(v)
156+
ans.WriteByte(byte('0' + x))
157+
}
158+
}
159+
}
160+
dfs(0)
161+
ans.WriteString(strings.Repeat("0", n-1))
162+
return ans.String()
163+
}
67164
```
68165

69166
### **...**

solution/0700-0799/0753.Cracking the Safe/README_EN.md

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,102 @@ Thus &quot;01100&quot; will unlock the safe. &quot;01100&quot;, &quot;10011&quot
6161
### **Python3**
6262

6363
```python
64-
64+
class Solution:
65+
def crackSafe(self, n: int, k: int) -> str:
66+
def dfs(u):
67+
for x in range(k):
68+
e = u * 10 + x
69+
if e not in vis:
70+
vis.add(e)
71+
v = e % mod
72+
dfs(v)
73+
ans.append(str(x))
74+
75+
mod = 10 ** (n - 1)
76+
vis = set()
77+
ans = []
78+
dfs(0)
79+
ans.append("0" * (n - 1))
80+
return "".join(ans)
6581
```
6682

6783
### **Java**
6884

6985
```java
86+
class Solution {
87+
private Set<Integer> vis = new HashSet<>();
88+
private StringBuilder ans = new StringBuilder();
89+
private int mod;
90+
91+
public String crackSafe(int n, int k) {
92+
mod = (int) Math.pow(10, n - 1);
93+
dfs(0, k);
94+
ans.append("0".repeat(n - 1));
95+
return ans.toString();
96+
}
97+
98+
private void dfs(int u, int k) {
99+
for (int x = 0; x < k; ++x) {
100+
int e = u * 10 + x;
101+
if (vis.add(e)) {
102+
int v = e % mod;
103+
dfs(v, k);
104+
ans.append(x);
105+
}
106+
}
107+
}
108+
}
109+
```
110+
111+
### **C++**
112+
113+
```cpp
114+
class Solution {
115+
public:
116+
string crackSafe(int n, int k) {
117+
unordered_set<int> vis;
118+
int mod = pow(10, n - 1);
119+
string ans;
120+
function<void(int)> dfs = [&](int u) {
121+
for (int x = 0; x < k; ++x) {
122+
int e = u * 10 + x;
123+
if (!vis.count(e)) {
124+
vis.insert(e);
125+
dfs(e % mod);
126+
ans += (x + '0');
127+
}
128+
}
129+
};
130+
dfs(0);
131+
ans += string(n - 1, '0');
132+
return ans;
133+
}
134+
};
135+
```
70136
137+
### **Go**
138+
139+
```go
140+
func crackSafe(n int, k int) string {
141+
mod := int(math.Pow(10, float64(n-1)))
142+
vis := map[int]bool{}
143+
ans := &strings.Builder{}
144+
var dfs func(int)
145+
dfs = func(u int) {
146+
for x := 0; x < k; x++ {
147+
e := u*10 + x
148+
if !vis[e] {
149+
vis[e] = true
150+
v := e % mod
151+
dfs(v)
152+
ans.WriteByte(byte('0' + x))
153+
}
154+
}
155+
}
156+
dfs(0)
157+
ans.WriteString(strings.Repeat("0", n-1))
158+
return ans.String()
159+
}
71160
```
72161

73162
### **...**
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
string crackSafe(int n, int k) {
4+
unordered_set<int> vis;
5+
int mod = pow(10, n - 1);
6+
string ans;
7+
function<void(int)> dfs = [&](int u) {
8+
for (int x = 0; x < k; ++x) {
9+
int e = u * 10 + x;
10+
if (!vis.count(e)) {
11+
vis.insert(e);
12+
dfs(e % mod);
13+
ans += (x + '0');
14+
}
15+
}
16+
};
17+
dfs(0);
18+
ans += string(n - 1, '0');
19+
return ans;
20+
}
21+
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
func crackSafe(n int, k int) string {
2+
mod := int(math.Pow(10, float64(n-1)))
3+
vis := map[int]bool{}
4+
ans := &strings.Builder{}
5+
var dfs func(int)
6+
dfs = func(u int) {
7+
for x := 0; x < k; x++ {
8+
e := u*10 + x
9+
if !vis[e] {
10+
vis[e] = true
11+
v := e % mod
12+
dfs(v)
13+
ans.WriteByte(byte('0' + x))
14+
}
15+
}
16+
}
17+
dfs(0)
18+
ans.WriteString(strings.Repeat("0", n-1))
19+
return ans.String()
20+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
private Set<Integer> vis = new HashSet<>();
3+
private StringBuilder ans = new StringBuilder();
4+
private int mod;
5+
6+
public String crackSafe(int n, int k) {
7+
mod = (int) Math.pow(10, n - 1);
8+
dfs(0, k);
9+
ans.append("0".repeat(n - 1));
10+
return ans.toString();
11+
}
12+
13+
private void dfs(int u, int k) {
14+
for (int x = 0; x < k; ++x) {
15+
int e = u * 10 + x;
16+
if (vis.add(e)) {
17+
int v = e % mod;
18+
dfs(v, k);
19+
ans.append(x);
20+
}
21+
}
22+
}
23+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
def crackSafe(self, n: int, k: int) -> str:
3+
def dfs(u):
4+
for x in range(k):
5+
e = u * 10 + x
6+
if e not in vis:
7+
vis.add(e)
8+
v = e % mod
9+
dfs(v)
10+
ans.append(str(x))
11+
12+
mod = 10 ** (n - 1)
13+
vis = set()
14+
ans = []
15+
dfs(0)
16+
ans.append("0" * (n - 1))
17+
return "".join(ans)

0 commit comments

Comments
 (0)