Skip to content

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)