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 b3e90f3

Browse files
committed
feat: add solutions to lc problem: No.1416
No.1416.Restore The Array
1 parent 32cbb4f commit b3e90f3

File tree

7 files changed

+721
-0
lines changed

7 files changed

+721
-0
lines changed

‎solution/1400-1499/1416.Restore The Array/README.md‎

Lines changed: 301 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,22 +64,323 @@
6464

6565
<!-- 这里可写通用的实现逻辑 -->
6666

67+
**方法一:记忆化搜索**
68+
69+
我们设计一个函数 $dfs(i),ドル表示从字符串的第 $i$ 个字符开始恢复数组的方案数。那么答案就是 $dfs(0)$。
70+
71+
函数 $dfs(i)$ 的执行逻辑如下:
72+
73+
- 如果 $i$ 超出了字符串的长度,说明我们已经恢复了整个数组,方案数为 1ドル$。
74+
- 如果 $i$ 对应的字符为 0ドル,ドル那么无法恢复出任何整数,方案数为 0ドル$。
75+
- 否则,我们枚举从 $i$ 开始的连续若干个字符 $s[i..j],ドル将其解析成一个整数 $x,ドル如果 $x$ 不超过 $k,ドル那么我们就可以从 $j+1$ 开始继续恢复数组,方案数为 $dfs(j+1)$。我们对所有的 $x$ 的方案数求和,即为 $dfs(i)$ 的值。
76+
77+
最后返回 $dfs(0)$ 即可。
78+
79+
为了避免重复计算,我们可以使用记忆化的方法进行优化。我们用一个数组 $f$ 记录所有的 $dfs(i)$ 的值,当我们需要计算 $dfs(i)$ 时,如果 $f[i]$ 已经被计算出来了,那么我们直接返回 $f[i]$ 即可。
80+
81+
时间复杂度 $(n \times \log k),ドル空间复杂度 $O(n)$。其中 $n$ 是字符串的长度,而 $k$ 是题目给定的整数 $k$。
82+
83+
**方法二:动态规划**
84+
85+
我们也可以使用动态规划的方法计算答案。
86+
87+
我们定义 $f[i]$ 表示将字符串 $s$ 的前 $i$ 个字符恢复成一个整数的方案数。初始时 $f[0]=1,ドル答案为 $f[n]$。
88+
89+
考虑 $f[i],ドル其中 $i \in [1,n]$。我们可以从大到小枚举 $j,ドル其中 $j \in [1,i],ドル如果 $s[j-1..i-1]$ 对应的整数 $x$ 不超过 $k,ドル且 $s[j-1] \neq '0',ドル那么我们就可以用 $f[j-1]$ 来更新 $f[i],ドル即 $f[i] = f[i] + f[j-1]$。在计算出所有的 $f[i]$ 之后,答案即为 $f[n]$。
90+
91+
时间复杂度 $O(n \times \log k),ドル空间复杂度 $O(n)$。其中 $n$ 是字符串的长度,而 $k$ 是题目给定的整数 $k$。
92+
6793
<!-- tabs:start -->
6894

6995
### **Python3**
7096

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

7399
```python
100+
class Solution:
101+
def numberOfArrays(self, s: str, k: int) -> int:
102+
@cache
103+
def dfs(i: int):
104+
if i >= n:
105+
return 1
106+
if s[i] == '0':
107+
return 0
108+
ans = x = 0
109+
for j in range(i, n):
110+
x = x * 10 + int(s[j])
111+
if x > k:
112+
break
113+
ans = (ans + dfs(j + 1)) % mod
114+
return ans
115+
116+
n = len(s)
117+
mod = 10**9 + 7
118+
return dfs(0)
119+
```
74120

121+
```python
122+
class Solution:
123+
def numberOfArrays(self, s: str, k: int) -> int:
124+
n = len(s)
125+
f = [1] + [0] * n
126+
mod = 10**9 + 7
127+
for i in range(1, n + 1):
128+
x, p = 0, 1
129+
for j in range(i, max(0, i - 11), -1):
130+
x = int(s[j - 1]) * p + x
131+
if x > k:
132+
break
133+
if s[j - 1] != '0':
134+
f[i] = (f[i] + f[j - 1]) % mod
135+
p *= 10
136+
return f[n]
75137
```
76138

77139
### **Java**
78140

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

81143
```java
144+
class Solution {
145+
private Integer[] f;
146+
private String s;
147+
private int n;
148+
private int k;
149+
150+
public int numberOfArrays(String s, int k) {
151+
n = s.length();
152+
this.s = s;
153+
this.k = k;
154+
f = new Integer[n];
155+
return dfs(0);
156+
}
157+
158+
private int dfs(int i) {
159+
if (i >= n) {
160+
return 1;
161+
}
162+
if (s.charAt(i) == '0') {
163+
return 0;
164+
}
165+
if (f[i] != null) {
166+
return f[i];
167+
}
168+
int ans = 0;
169+
long x = 0;
170+
final int mod = (int) 1e9 + 7;
171+
for (int j = i; j < n; ++j) {
172+
x = x * 10 + s.charAt(j) - '0';
173+
if (x > k) {
174+
break;
175+
}
176+
ans = (ans + dfs(j + 1)) % mod;
177+
}
178+
return f[i] = ans;
179+
}
180+
}
181+
```
182+
183+
```java
184+
class Solution {
185+
public int numberOfArrays(String s, int k) {
186+
int n = s.length();
187+
int[] f = new int[n + 1];
188+
f[0] = 1;
189+
final int mod = (int) 1e9 + 7;
190+
for (int i = 1; i <= n; ++i) {
191+
long x = 0, p = 1;
192+
for (int j = i; j > Math.max(i - 11, 0); --j) {
193+
x = (s.charAt(j - 1) - '0') * p + x;
194+
if (x > k) {
195+
break;
196+
}
197+
if (s.charAt(j - 1) != '0') {
198+
f[i] = (f[i] + f[j - 1]) % mod;
199+
}
200+
p *= 10;
201+
}
202+
}
203+
return f[n];
204+
}
205+
}
206+
```
207+
208+
### **C++**
209+
210+
```cpp
211+
class Solution {
212+
public:
213+
int numberOfArrays(string s, int k) {
214+
int n = s.size();
215+
int f[n];
216+
memset(f, -1, sizeof(f));
217+
const int mod = 1e9 + 7;
218+
function<int(int)> dfs = [&](int i) -> int {
219+
if (i >= n) {
220+
return 1;
221+
}
222+
if (s[i] == '0') {
223+
return 0;
224+
}
225+
if (f[i] != -1) {
226+
return f[i];
227+
}
228+
int ans = 0;
229+
long long x = 0;
230+
for (int j = i; j < n; ++j) {
231+
x = x * 10 + s[j] - '0';
232+
if (x > k) {
233+
break;
234+
}
235+
ans = (ans + dfs(j + 1)) % mod;
236+
}
237+
return f[i] = ans;
238+
};
239+
return dfs(0);
240+
}
241+
};
242+
```
243+
244+
```cpp
245+
class Solution {
246+
public:
247+
int numberOfArrays(string s, int k) {
248+
int n = s.size();
249+
int f[n + 1];
250+
memset(f, 0, sizeof(f));
251+
f[0] = 1;
252+
const int mod = 1e9 + 7;
253+
for (int i = 1; i <= n; ++i) {
254+
long x = 0, p = 1;
255+
for (int j = i; j > max(i - 11, 0); --j) {
256+
x = (s[j - 1] - '0') * p + x;
257+
if (x > k) {
258+
break;
259+
}
260+
if (s[j - 1] != '0') {
261+
f[i] = (f[i] + f[j - 1]) % mod;
262+
}
263+
p *= 10;
264+
}
265+
}
266+
return f[n];
267+
}
268+
};
269+
```
270+
271+
### **Go**
272+
273+
```go
274+
func numberOfArrays(s string, k int) int {
275+
n := len(s)
276+
f := make([]int, n)
277+
for i := range f {
278+
f[i] = -1
279+
}
280+
const mod int = 1e9 + 7
281+
var dfs func(int) int
282+
dfs = func(i int) int {
283+
if i >= n {
284+
return 1
285+
}
286+
if s[i] == '0' {
287+
return 0
288+
}
289+
if f[i] != -1 {
290+
return f[i]
291+
}
292+
ans, x := 0, 0
293+
for j := i; j < n; j++ {
294+
x = x*10 + int(s[j]-'0')
295+
if x > k {
296+
break
297+
}
298+
ans = (ans + dfs(j+1)) % mod
299+
}
300+
f[i] = ans
301+
return ans
302+
}
303+
return dfs(0)
304+
}
305+
```
306+
307+
```go
308+
func numberOfArrays(s string, k int) int {
309+
n := len(s)
310+
f := make([]int, n+1)
311+
f[0] = 1
312+
const mod int = 1e9 + 7
313+
for i := 1; i <= n; i++ {
314+
x, p := 0, 1
315+
for j := i; j > i-11 && j > 0; j-- {
316+
x = int(s[j-1]-'0')*p + x
317+
if x > k {
318+
break
319+
}
320+
if s[j-1] != '0' {
321+
f[i] = (f[i] + f[j-1]) % mod
322+
}
323+
p *= 10
324+
}
325+
}
326+
return f[n]
327+
}
328+
```
329+
330+
### **TypeScript**
331+
332+
```ts
333+
function numberOfArrays(s: string, k: number): number {
334+
const n = s.length;
335+
const f: number[] = new Array(n + 1).fill(-1);
336+
const dfs = (i: number): number => {
337+
if (i >= n) {
338+
return 1;
339+
}
340+
if (s[i] === '0') {
341+
return 0;
342+
}
343+
if (f[i] !== -1) {
344+
return f[i];
345+
}
346+
let x = 0;
347+
let ans = 0;
348+
for (let j = i; j < n; ++j) {
349+
x = x * 10 + s[j].charCodeAt(0) - '0'.charCodeAt(0);
350+
if (x > k) {
351+
break;
352+
}
353+
ans += dfs(j + 1);
354+
ans %= 1000000007;
355+
}
356+
return (f[i] = ans);
357+
};
358+
return dfs(0);
359+
}
360+
```
82361

362+
```ts
363+
function numberOfArrays(s: string, k: number): number {
364+
const n = s.length;
365+
const f: number[] = new Array(n + 1).fill(0);
366+
f[0] = 1;
367+
for (let i = 1; i <= n; ++i) {
368+
let x = 0;
369+
let p = 1;
370+
for (let j = i; j > Math.max(0, i - 11); --j) {
371+
x = (s[j - 1].charCodeAt(0) - '0'.charCodeAt(0)) * p + x;
372+
if (x > k) {
373+
break;
374+
}
375+
if (s[j - 1] !== '0') {
376+
f[i] += f[j - 1];
377+
f[i] %= 1000000007;
378+
}
379+
p *= 10;
380+
}
381+
}
382+
return f[n];
383+
}
83384
```
84385

85386
### **...**

0 commit comments

Comments
(0)

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