Skip to content

Commit 78ef0fa

Browse files
committed
feat: add solutions to lc problem: No.0842
No.0842.Split Array into Fibonacci Sequence
1 parent ff61144 commit 78ef0fa

File tree

6 files changed

+387
-2
lines changed

6 files changed

+387
-2
lines changed

solution/0800-0899/0842.Split Array into Fibonacci Sequence/README.md

+140-1
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,161 @@
5858

5959
<!-- 这里可写通用的实现逻辑 -->
6060

61+
**方法一:回溯 + 剪枝**
62+
63+
我们设计一个函数 $dfs(i)$,表示从字符串 $num$ 的第 $i$ 个字符开始拆分,拆分出的斐波那契式序列是否满足题目要求。如果满足,我们就返回 $true$,否则返回 $false$。
64+
65+
函数 $dfs(i)$ 的具体实现如下:
66+
67+
如果 $i$ 等于字符串 $num$ 的长度,说明我们已经拆分完整个字符串,此时我们只需要判断拆分出的序列的长度是否大于 $2$ 即可。如果大于 $2$,说明我们找到了一组满足题目要求的斐波那契式序列,返回 $true$;否则返回 $false$。
68+
69+
如果 $i$ 小于字符串 $num$ 的长度,我们需要枚举拆分出的第一个数 $x$,如果 $x$ 的长度大于 $1$,且以 $0$ 开头,说明 $x$ 不是一个合法的数,我们直接返回 $false$。否则我们将 $x$ 转换成十进制数,如果 $x$ 大于 $2^{31} - 1$,或者 $x$ 大于 $ans$ 的最后两个数之和,直接返回 $false$。如果 $ans$ 的长度小于 $2$,或者 $x$ 等于 $ans$ 的最后两个数之和,我们将 $x$ 加入到 $ans$ 中,然后继续拆分字符串 $num$ 的后面的部分,如果返回 $true$,说明我们找到了一组满足题目要求的斐波那契式序列,返回 $true$;否则我们将 $x$ 从 $ans$ 中移除,然后继续枚举拆分出的第一个数 $x$。
70+
71+
时间复杂度 $O(n \times \log^2 M)$,空间复杂度 $O(n)$。其中 $n$ 和 $M$ 分别是字符串 $num$ 的长度和整型数的最大值。
72+
6173
<!-- tabs:start -->
6274

6375
### **Python3**
6476

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

6779
```python
68-
80+
class Solution:
81+
def splitIntoFibonacci(self, num: str) -> List[int]:
82+
def dfs(i):
83+
if i == n:
84+
return len(ans) > 2
85+
x = 0
86+
for j in range(i, n):
87+
if j > i and num[i] == '0':
88+
break
89+
x = x * 10 + int(num[j])
90+
if x > 2**31 - 1 or (len(ans) > 2 and x > ans[-2] + ans[-1]):
91+
break
92+
if len(ans) < 2 or ans[-2] + ans[-1] == x:
93+
ans.append(x)
94+
if dfs(j + 1):
95+
return True
96+
ans.pop()
97+
return False
98+
99+
n = len(num)
100+
ans = []
101+
dfs(0)
102+
return ans
69103
```
70104

71105
### **Java**
72106

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

75109
```java
110+
class Solution {
111+
private List<Integer> ans = new ArrayList<>();
112+
private String num;
113+
114+
public List<Integer> splitIntoFibonacci(String num) {
115+
this.num = num;
116+
dfs(0);
117+
return ans;
118+
}
119+
120+
private boolean dfs(int i) {
121+
if (i == num.length()) {
122+
return ans.size() >= 3;
123+
}
124+
long x = 0;
125+
for (int j = i; j < num.length(); ++j) {
126+
if (j > i && num.charAt(i) == '0') {
127+
break;
128+
}
129+
x = x * 10 + num.charAt(j) - '0';
130+
if (x > Integer.MAX_VALUE || (ans.size() >= 2 && x > ans.get(ans.size() - 1) + ans.get(ans.size() - 2))) {
131+
break;
132+
}
133+
if (ans.size() < 2 || x == ans.get(ans.size() - 1) + ans.get(ans.size() - 2)) {
134+
ans.add((int) x);
135+
if (dfs(j + 1)) {
136+
return true;
137+
}
138+
ans.remove(ans.size() - 1);
139+
}
140+
}
141+
return false;
142+
}
143+
}
144+
```
145+
146+
### **C++**
147+
148+
```cpp
149+
class Solution {
150+
public:
151+
vector<int> splitIntoFibonacci(string num) {
152+
int n = num.size();
153+
vector<int> ans;
154+
function<bool(int)> dfs = [&](int i) -> bool {
155+
if (i == n) {
156+
return ans.size() > 2;
157+
}
158+
long long x = 0;
159+
for (int j = i; j < n; ++j) {
160+
if (j > i && num[i] == '0') {
161+
break;
162+
}
163+
x = x * 10 + num[j] - '0';
164+
if (x > INT_MAX || (ans.size() > 1 && x > (long long) ans[ans.size() - 1] + ans[ans.size() - 2])) {
165+
break;
166+
}
167+
if (ans.size() < 2 || x == (long long) ans[ans.size() - 1] + ans[ans.size() - 2]) {
168+
ans.push_back(x);
169+
if (dfs(j + 1)) {
170+
return true;
171+
}
172+
ans.pop_back();
173+
}
174+
}
175+
return false;
176+
};
177+
dfs(0);
178+
return ans;
179+
}
180+
};
181+
```
76182
183+
### **Go**
184+
185+
```go
186+
func splitIntoFibonacci(num string) []int {
187+
n := len(num)
188+
ans := []int{}
189+
var dfs func(int) bool
190+
dfs = func(i int) bool {
191+
if i == n {
192+
return len(ans) > 2
193+
}
194+
x := 0
195+
for j := i; j < n; j++ {
196+
if j > i && num[i] == '0' {
197+
break
198+
}
199+
x = x*10 + int(num[j]-'0')
200+
if x > math.MaxInt32 || (len(ans) > 1 && x > ans[len(ans)-1]+ans[len(ans)-2]) {
201+
break
202+
}
203+
if len(ans) < 2 || x == ans[len(ans)-1]+ans[len(ans)-2] {
204+
ans = append(ans, x)
205+
if dfs(j + 1) {
206+
return true
207+
}
208+
ans = ans[:len(ans)-1]
209+
}
210+
}
211+
return false
212+
}
213+
dfs(0)
214+
return ans
215+
}
77216
```
78217

79218
### **...**

solution/0800-0899/0842.Split Array into Fibonacci Sequence/README_EN.md

+128-1
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,140 @@
5858
### **Python3**
5959

6060
```python
61-
61+
class Solution:
62+
def splitIntoFibonacci(self, num: str) -> List[int]:
63+
def dfs(i):
64+
if i == n:
65+
return len(ans) > 2
66+
x = 0
67+
for j in range(i, n):
68+
if j > i and num[i] == '0':
69+
break
70+
x = x * 10 + int(num[j])
71+
if x > 2**31 - 1 or (len(ans) > 2 and x > ans[-2] + ans[-1]):
72+
break
73+
if len(ans) < 2 or ans[-2] + ans[-1] == x:
74+
ans.append(x)
75+
if dfs(j + 1):
76+
return True
77+
ans.pop()
78+
return False
79+
80+
n = len(num)
81+
ans = []
82+
dfs(0)
83+
return ans
6284
```
6385

6486
### **Java**
6587

6688
```java
89+
class Solution {
90+
private List<Integer> ans = new ArrayList<>();
91+
private String num;
92+
93+
public List<Integer> splitIntoFibonacci(String num) {
94+
this.num = num;
95+
dfs(0);
96+
return ans;
97+
}
98+
99+
private boolean dfs(int i) {
100+
if (i == num.length()) {
101+
return ans.size() >= 3;
102+
}
103+
long x = 0;
104+
for (int j = i; j < num.length(); ++j) {
105+
if (j > i && num.charAt(i) == '0') {
106+
break;
107+
}
108+
x = x * 10 + num.charAt(j) - '0';
109+
if (x > Integer.MAX_VALUE || (ans.size() >= 2 && x > ans.get(ans.size() - 1) + ans.get(ans.size() - 2))) {
110+
break;
111+
}
112+
if (ans.size() < 2 || x == ans.get(ans.size() - 1) + ans.get(ans.size() - 2)) {
113+
ans.add((int) x);
114+
if (dfs(j + 1)) {
115+
return true;
116+
}
117+
ans.remove(ans.size() - 1);
118+
}
119+
}
120+
return false;
121+
}
122+
}
123+
```
124+
125+
### **C++**
126+
127+
```cpp
128+
class Solution {
129+
public:
130+
vector<int> splitIntoFibonacci(string num) {
131+
int n = num.size();
132+
vector<int> ans;
133+
function<bool(int)> dfs = [&](int i) -> bool {
134+
if (i == n) {
135+
return ans.size() > 2;
136+
}
137+
long long x = 0;
138+
for (int j = i; j < n; ++j) {
139+
if (j > i && num[i] == '0') {
140+
break;
141+
}
142+
x = x * 10 + num[j] - '0';
143+
if (x > INT_MAX || (ans.size() > 1 && x > (long long) ans[ans.size() - 1] + ans[ans.size() - 2])) {
144+
break;
145+
}
146+
if (ans.size() < 2 || x == (long long) ans[ans.size() - 1] + ans[ans.size() - 2]) {
147+
ans.push_back(x);
148+
if (dfs(j + 1)) {
149+
return true;
150+
}
151+
ans.pop_back();
152+
}
153+
}
154+
return false;
155+
};
156+
dfs(0);
157+
return ans;
158+
}
159+
};
160+
```
67161
162+
### **Go**
163+
164+
```go
165+
func splitIntoFibonacci(num string) []int {
166+
n := len(num)
167+
ans := []int{}
168+
var dfs func(int) bool
169+
dfs = func(i int) bool {
170+
if i == n {
171+
return len(ans) > 2
172+
}
173+
x := 0
174+
for j := i; j < n; j++ {
175+
if j > i && num[i] == '0' {
176+
break
177+
}
178+
x = x*10 + int(num[j]-'0')
179+
if x > math.MaxInt32 || (len(ans) > 1 && x > ans[len(ans)-1]+ans[len(ans)-2]) {
180+
break
181+
}
182+
if len(ans) < 2 || x == ans[len(ans)-1]+ans[len(ans)-2] {
183+
ans = append(ans, x)
184+
if dfs(j + 1) {
185+
return true
186+
}
187+
ans = ans[:len(ans)-1]
188+
}
189+
}
190+
return false
191+
}
192+
dfs(0)
193+
return ans
194+
}
68195
```
69196

70197
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution {
2+
public:
3+
vector<int> splitIntoFibonacci(string num) {
4+
int n = num.size();
5+
vector<int> ans;
6+
function<bool(int)> dfs = [&](int i) -> bool {
7+
if (i == n) {
8+
return ans.size() > 2;
9+
}
10+
long long x = 0;
11+
for (int j = i; j < n; ++j) {
12+
if (j > i && num[i] == '0') {
13+
break;
14+
}
15+
x = x * 10 + num[j] - '0';
16+
if (x > INT_MAX || (ans.size() > 1 && x > (long long) ans[ans.size() - 1] + ans[ans.size() - 2])) {
17+
break;
18+
}
19+
if (ans.size() < 2 || x == (long long) ans[ans.size() - 1] + ans[ans.size() - 2]) {
20+
ans.push_back(x);
21+
if (dfs(j + 1)) {
22+
return true;
23+
}
24+
ans.pop_back();
25+
}
26+
}
27+
return false;
28+
};
29+
dfs(0);
30+
return ans;
31+
}
32+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
func splitIntoFibonacci(num string) []int {
2+
n := len(num)
3+
ans := []int{}
4+
var dfs func(int) bool
5+
dfs = func(i int) bool {
6+
if i == n {
7+
return len(ans) > 2
8+
}
9+
x := 0
10+
for j := i; j < n; j++ {
11+
if j > i && num[i] == '0' {
12+
break
13+
}
14+
x = x*10 + int(num[j]-'0')
15+
if x > math.MaxInt32 || (len(ans) > 1 && x > ans[len(ans)-1]+ans[len(ans)-2]) {
16+
break
17+
}
18+
if len(ans) < 2 || x == ans[len(ans)-1]+ans[len(ans)-2] {
19+
ans = append(ans, x)
20+
if dfs(j + 1) {
21+
return true
22+
}
23+
ans = ans[:len(ans)-1]
24+
}
25+
}
26+
return false
27+
}
28+
dfs(0)
29+
return ans
30+
}

0 commit comments

Comments
 (0)