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 9f6af49

Browse files
committed
feat: add solutions to lc problem: No.0306
No.0306.Additive Number
1 parent 67886c1 commit 9f6af49

File tree

6 files changed

+420
-45
lines changed

6 files changed

+420
-45
lines changed

‎solution/0300-0399/0306.Additive Number/README.md‎

Lines changed: 146 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,167 @@
3434

3535
<!-- 这里可写通用的实现逻辑 -->
3636

37+
DFS + 剪枝。
38+
39+
Python 大整数相加不会有溢出问题。由于 num 字符串长度最大为 35,因此对于其他语言,可以通过控制整数长度防止溢出。
40+
3741
<!-- tabs:start -->
3842

3943
### **Python3**
4044

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

4347
```python
44-
48+
class Solution:
49+
def isAdditiveNumber(self, num: str) -> bool:
50+
def dfs(a, b, num):
51+
if not num:
52+
return True
53+
if a + b > 0 and num[0] == '0':
54+
return False
55+
for i in range(1, len(num) + 1):
56+
if a + b == int(num[:i]):
57+
if dfs(b, a + b, num[i:]):
58+
return True
59+
return False
60+
61+
n = len(num)
62+
for i in range(1, n - 1):
63+
for j in range(i + 1, n):
64+
if i > 1 and num[0] == '0':
65+
break
66+
if j - i > 1 and num[i] == '0':
67+
continue
68+
if dfs(int(num[:i]), int(num[i: j]), num[j:]):
69+
return True
70+
return False
4571
```
4672

4773
### **Java**
4874

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

5177
```java
78+
class Solution {
79+
public boolean isAdditiveNumber(String num) {
80+
int n = num.length();
81+
for (int i = 1; i < Math.min(n - 1, 19); ++i) {
82+
for (int j = i + 1; j < Math.min(n, i + 19); ++j) {
83+
if (i > 1 && num.charAt(0) == '0') {
84+
break;
85+
}
86+
if (j - i > 1 && num.charAt(i) == '0') {
87+
continue;
88+
}
89+
long a = Long.parseLong(num.substring(0, i));
90+
long b = Long.parseLong(num.substring(i, j));
91+
if (dfs(a, b, num.substring(j))) {
92+
return true;
93+
}
94+
}
95+
}
96+
return false;
97+
}
98+
99+
private boolean dfs(long a, long b, String num) {
100+
if ("".equals(num)) {
101+
return true;
102+
}
103+
if (a + b > 0 && num.charAt(0) == '0') {
104+
return false;
105+
}
106+
for (int i = 1; i < Math.min(num.length() + 1, 19); ++i) {
107+
if (a + b == Long.parseLong(num.substring(0, i))) {
108+
if (dfs(b, a + b, num.substring(i))) {
109+
return true;
110+
}
111+
}
112+
}
113+
return false;
114+
}
115+
}
116+
```
117+
118+
### **C++**
119+
120+
```cpp
121+
class Solution {
122+
public:
123+
bool isAdditiveNumber(string num) {
124+
int n = num.size();
125+
for (int i = 1; i < min(n - 1, 19); ++i)
126+
{
127+
for (int j = i + 1; j < min(n, i + 19); ++j)
128+
{
129+
if (i > 1 && num[0] == '0') break;
130+
if (j - i > 1 && num[i] == '0') continue;
131+
auto a = stoll(num.substr(0, i));
132+
auto b = stoll(num.substr(i, j - i));
133+
if (dfs(a, b, num.substr(j, n - j))) return true;
134+
}
135+
}
136+
return false;
137+
}
138+
139+
bool dfs(long long a, long long b, string num) {
140+
if (num == "") return true;
141+
if (a + b > 0 && num[0] == '0') return false;
142+
for (int i = 1; i < min((int) num.size() + 1, 19); ++i)
143+
if (a + b == stoll(num.substr(0, i)))
144+
if (dfs(b, a + b, num.substr(i, num.size() - i)))
145+
return true;
146+
return false;
147+
}
148+
};
149+
```
52150

151+
### **Go**
152+
153+
```go
154+
func isAdditiveNumber(num string) bool {
155+
n := len(num)
156+
var dfs func(a, b int64, num string) bool
157+
dfs = func(a, b int64, num string) bool {
158+
if num == "" {
159+
return true
160+
}
161+
if a+b > 0 && num[0] == '0' {
162+
return false
163+
}
164+
for i := 1; i < min(len(num)+1, 19); i++ {
165+
c, _ := strconv.ParseInt(num[:i], 10, 64)
166+
if a+b == c {
167+
if dfs(b, c, num[i:]) {
168+
return true
169+
}
170+
}
171+
}
172+
return false
173+
}
174+
for i := 1; i < min(n-1, 19); i++ {
175+
for j := i + 1; j < min(n, i+19); j++ {
176+
if i > 1 && num[0] == '0' {
177+
break
178+
}
179+
if j-i > 1 && num[i] == '0' {
180+
continue
181+
}
182+
a, _ := strconv.ParseInt(num[:i], 10, 64)
183+
b, _ := strconv.ParseInt(num[i:j], 10, 64)
184+
if dfs(a, b, num[j:]) {
185+
return true
186+
}
187+
}
188+
}
189+
return false
190+
}
191+
192+
func min(a, b int) int {
193+
if a < b {
194+
return a
195+
}
196+
return b
197+
}
53198
```
54199

55200
### **...**

‎solution/0300-0399/0306.Additive Number/README_EN.md‎

Lines changed: 142 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,154 @@ How would you handle overflow for very large input integers?</p>
4949
### **Python3**
5050

5151
```python
52-
52+
class Solution:
53+
def isAdditiveNumber(self, num: str) -> bool:
54+
def dfs(a, b, num):
55+
if not num:
56+
return True
57+
if a + b > 0 and num[0] == '0':
58+
return False
59+
for i in range(1, len(num) + 1):
60+
if a + b == int(num[:i]):
61+
if dfs(b, a + b, num[i:]):
62+
return True
63+
return False
64+
65+
n = len(num)
66+
for i in range(1, n - 1):
67+
for j in range(i + 1, n):
68+
if i > 1 and num[0] == '0':
69+
break
70+
if j - i > 1 and num[i] == '0':
71+
continue
72+
if dfs(int(num[:i]), int(num[i: j]), num[j:]):
73+
return True
74+
return False
5375
```
5476

5577
### **Java**
5678

5779
```java
80+
class Solution {
81+
public boolean isAdditiveNumber(String num) {
82+
int n = num.length();
83+
for (int i = 1; i < Math.min(n - 1, 19); ++i) {
84+
for (int j = i + 1; j < Math.min(n, i + 19); ++j) {
85+
if (i > 1 && num.charAt(0) == '0') {
86+
break;
87+
}
88+
if (j - i > 1 && num.charAt(i) == '0') {
89+
continue;
90+
}
91+
long a = Long.parseLong(num.substring(0, i));
92+
long b = Long.parseLong(num.substring(i, j));
93+
if (dfs(a, b, num.substring(j))) {
94+
return true;
95+
}
96+
}
97+
}
98+
return false;
99+
}
100+
101+
private boolean dfs(long a, long b, String num) {
102+
if ("".equals(num)) {
103+
return true;
104+
}
105+
if (a + b > 0 && num.charAt(0) == '0') {
106+
return false;
107+
}
108+
for (int i = 1; i < Math.min(num.length() + 1, 19); ++i) {
109+
if (a + b == Long.parseLong(num.substring(0, i))) {
110+
if (dfs(b, a + b, num.substring(i))) {
111+
return true;
112+
}
113+
}
114+
}
115+
return false;
116+
}
117+
}
118+
```
119+
120+
### **C++**
121+
122+
```cpp
123+
class Solution {
124+
public:
125+
bool isAdditiveNumber(string num) {
126+
int n = num.size();
127+
for (int i = 1; i < min(n - 1, 19); ++i)
128+
{
129+
for (int j = i + 1; j < min(n, i + 19); ++j)
130+
{
131+
if (i > 1 && num[0] == '0') break;
132+
if (j - i > 1 && num[i] == '0') continue;
133+
auto a = stoll(num.substr(0, i));
134+
auto b = stoll(num.substr(i, j - i));
135+
if (dfs(a, b, num.substr(j, n - j))) return true;
136+
}
137+
}
138+
return false;
139+
}
140+
141+
bool dfs(long long a, long long b, string num) {
142+
if (num == "") return true;
143+
if (a + b > 0 && num[0] == '0') return false;
144+
for (int i = 1; i < min((int) num.size() + 1, 19); ++i)
145+
if (a + b == stoll(num.substr(0, i)))
146+
if (dfs(b, a + b, num.substr(i, num.size() - i)))
147+
return true;
148+
return false;
149+
}
150+
};
151+
```
58152

153+
### **Go**
154+
155+
```go
156+
func isAdditiveNumber(num string) bool {
157+
n := len(num)
158+
var dfs func(a, b int64, num string) bool
159+
dfs = func(a, b int64, num string) bool {
160+
if num == "" {
161+
return true
162+
}
163+
if a+b > 0 && num[0] == '0' {
164+
return false
165+
}
166+
for i := 1; i < min(len(num)+1, 19); i++ {
167+
c, _ := strconv.ParseInt(num[:i], 10, 64)
168+
if a+b == c {
169+
if dfs(b, c, num[i:]) {
170+
return true
171+
}
172+
}
173+
}
174+
return false
175+
}
176+
for i := 1; i < min(n-1, 19); i++ {
177+
for j := i + 1; j < min(n, i+19); j++ {
178+
if i > 1 && num[0] == '0' {
179+
break
180+
}
181+
if j-i > 1 && num[i] == '0' {
182+
continue
183+
}
184+
a, _ := strconv.ParseInt(num[:i], 10, 64)
185+
b, _ := strconv.ParseInt(num[i:j], 10, 64)
186+
if dfs(a, b, num[j:]) {
187+
return true
188+
}
189+
}
190+
}
191+
return false
192+
}
193+
194+
func min(a, b int) int {
195+
if a < b {
196+
return a
197+
}
198+
return b
199+
}
59200
```
60201

61202
### **...**
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
public:
3+
bool isAdditiveNumber(string num) {
4+
int n = num.size();
5+
for (int i = 1; i < min(n - 1, 19); ++i)
6+
{
7+
for (int j = i + 1; j < min(n, i + 19); ++j)
8+
{
9+
if (i > 1 && num[0] == '0') break;
10+
if (j - i > 1 && num[i] == '0') continue;
11+
auto a = stoll(num.substr(0, i));
12+
auto b = stoll(num.substr(i, j - i));
13+
if (dfs(a, b, num.substr(j, n - j))) return true;
14+
}
15+
}
16+
return false;
17+
}
18+
19+
bool dfs(long long a, long long b, string num) {
20+
if (num == "") return true;
21+
if (a + b > 0 && num[0] == '0') return false;
22+
for (int i = 1; i < min((int) num.size() + 1, 19); ++i)
23+
if (a + b == stoll(num.substr(0, i)))
24+
if (dfs(b, a + b, num.substr(i, num.size() - i)))
25+
return true;
26+
return false;
27+
}
28+
};

0 commit comments

Comments
(0)

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