Skip to content

Commit b2eb0b8

Browse files
Merge pull request #325 from flames519/master
回溯,组合分割 JavaScript版本
2 parents 970efed + 533964a commit b2eb0b8

7 files changed

+210
-31
lines changed

problems/0017.电话号码的字母组合.md

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ for (int i = 0; i < letters.size(); i++) {
137137
关键地方都讲完了,按照[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)中的回溯法模板,不难写出如下C++代码:
138138

139139

140-
```
140+
```c++
141141
// 版本一
142142
class Solution {
143143
private:
@@ -183,7 +183,7 @@ public:
183183
184184
一些写法,是把回溯的过程放在递归函数里了,例如如下代码,我可以写成这样:(注意注释中不一样的地方)
185185
186-
```
186+
```c++
187187
// 版本二
188188
class Solution {
189189
private:
@@ -319,7 +319,7 @@ class Solution:
319319

320320
python3:
321321

322-
```python3
322+
```py
323323
class Solution:
324324
def letterCombinations(self, digits: str) -> List[str]:
325325
self.s = ""
@@ -342,6 +342,33 @@ class Solution:
342342

343343
Go:
344344

345+
javaScript:
346+
347+
```js
348+
var letterCombinations = function(digits) {
349+
const k = digits.length;
350+
const map = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"];
351+
if(!k) return [];
352+
if(k === 1) return map[digits].split("");
353+
354+
const res = [], path = [];
355+
backtracking(digits, k, 0);
356+
return res;
357+
358+
function backtracking(n, k, a) {
359+
if(path.length === k) {
360+
res.push(path.join(""));
361+
return;
362+
}
363+
for(const v of map[n[a]]) {
364+
path.push(v);
365+
backtracking(n, k, a + 1);
366+
path.pop();
367+
}
368+
369+
}
370+
};
371+
```
345372

346373

347374

problems/0039.组合总和.md

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -286,30 +286,30 @@ class Solution:
286286
```
287287
Go:
288288

289-
JavaScript
289+
JavaScript:
290+
290291
```js
291-
var strStr = function (haystack, needle) {
292-
if (needle === '') {
293-
return 0;
294-
}
295-
296-
let hayslen = haystack.length;
297-
let needlen = needle.length;
298-
299-
if (haystack === '' || hayslen < needlen) {
300-
return -1;
301-
}
302-
303-
for (let i = 0; i <= hayslen - needlen; i++) {
304-
if (haystack[i] === needle[0]) {
305-
if (haystack.substr(i, needlen) === needle) {
306-
return i;
307-
}
308-
}
309-
if (i === hayslen - needlen) {
310-
return -1;
292+
var combinationSum = function(candidates, target) {
293+
const res = [], path = [];
294+
candidates.sort(); // 排序
295+
backtracking(0, 0);
296+
return res;
297+
function backtracking(j, sum) {
298+
if (sum > target) return;
299+
if (sum === target) {
300+
res.push(Array.from(path));
301+
return;
302+
}
303+
for(let i = j; i < candidates.length; i++ ) {
304+
const n = candidates[i];
305+
if(n > target - sum) continue;
306+
path.push(n);
307+
sum += n;
308+
backtracking(i, sum);
309+
path.pop();
310+
sum -= n;
311+
}
311312
}
312-
}
313313
};
314314
```
315315

problems/0040.组合总和II.md

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ class Solution {
293293
}
294294
```
295295
Python:
296-
```python3
296+
```py
297297
class Solution:
298298
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
299299
res = []
@@ -314,7 +314,39 @@ class Solution:
314314
```
315315
Go:
316316

317-
317+
javaScript:
318+
319+
```js
320+
/**
321+
* @param {number[]} candidates
322+
* @param {number} target
323+
* @return {number[][]}
324+
*/
325+
var combinationSum2 = function(candidates, target) {
326+
const res = []; path = [], len = candidates.length;
327+
candidates.sort();
328+
backtracking(0, 0);
329+
return res;
330+
function backtracking(sum, i) {
331+
if (sum > target) return;
332+
if (sum === target) {
333+
res.push(Array.from(path));
334+
return;
335+
}
336+
let f = -1;
337+
for(let j = i; j < len; j++) {
338+
const n = candidates[j];
339+
if(n > target - sum || n === f) continue;
340+
path.push(n);
341+
sum += n;
342+
f = n;
343+
backtracking(sum, j + 1);
344+
path.pop();
345+
sum -= n;
346+
}
347+
}
348+
};
349+
```
318350

319351

320352
-----------------------

problems/0077.组合优化.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public:
147147

148148

149149
Java:
150-
```
150+
```java
151151
class Solution {
152152
List<List<Integer>> result = new ArrayList<>();
153153
LinkedList<Integer> path = new LinkedList<>();
@@ -220,6 +220,28 @@ func backtrack(n,k,start int,track []int){
220220
}
221221
```
222222

223+
javaScript:
224+
225+
```js
226+
var combine = function(n, k) {
227+
const res = [], path = [];
228+
backtracking(n, k, 1);
229+
return res;
230+
function backtracking (n, k, i){
231+
const len = path.length;
232+
if(len === k) {
233+
res.push(Array.from(path));
234+
return;
235+
}
236+
for(let a = i; a <= n + len - k + 1; a++) {
237+
path.push(a);
238+
backtracking(n, k, a + 1);
239+
path.pop();
240+
}
241+
}
242+
};
243+
```
244+
223245

224246

225247

problems/0093.复原IP地址.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,35 @@ class Solution(object):
338338
return ans```
339339
```
340340

341+
JavaScript:
342+
343+
```js
344+
/**
345+
* @param {string} s
346+
* @return {string[]}
347+
*/
348+
var restoreIpAddresses = function(s) {
349+
const res = [], path = [];
350+
backtracking(0, 0)
351+
return res;
352+
function backtracking(i) {
353+
const len = path.length;
354+
if(len > 4) return;
355+
if(len === 4 && i === s.length) {
356+
res.push(path.join("."));
357+
return;
358+
}
359+
for(let j = i; j < s.length; j++) {
360+
const str = s.substr(i, j - i + 1);
361+
if(str.length > 3 || +str > 255) break;
362+
if(str.length > 1 && str[0] === "0") break;
363+
path.push(str);
364+
backtracking(j + 1);
365+
path.pop()
366+
}
367+
}
368+
};
369+
```
341370

342371
-----------------------
343372
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)

problems/0131.分割回文串.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ class Solution {
292292
```
293293

294294
Python:
295-
```python3
295+
```py
296296
class Solution:
297297
def partition(self, s: str) -> List[List[str]]:
298298
res = []
@@ -313,7 +313,38 @@ class Solution:
313313

314314
Go:
315315

316+
javaScript:
316317

318+
```js
319+
/**
320+
* @param {string} s
321+
* @return {string[][]}
322+
*/
323+
const isPalindrome = (s, l, r) => {
324+
for (let i = l, j = r; i < j; i++, j--) {
325+
if(s[i] !== s[j]) return false;
326+
}
327+
return true;
328+
}
329+
330+
var partition = function(s) {
331+
const res = [], path = [], len = s.length;
332+
backtracking(0);
333+
return res;
334+
function backtracking(i) {
335+
if(i >= len) {
336+
res.push(Array.from(path));
337+
return;
338+
}
339+
for(let j = i; j < len; j++) {
340+
if(!isPalindrome(s, i, j)) continue;
341+
path.push(s.substr(i, j - i + 1));
342+
backtracking(j + 1);
343+
path.pop();
344+
}
345+
}
346+
};
347+
```
317348

318349

319350
-----------------------

problems/0216.组合总和III.md

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ if (sum > targetSum) { // 剪枝操作
180180
181181
最后C++代码如下:
182182
183-
```
183+
```c++
184184
class Solution {
185185
private:
186186
vector<vector<int>> result; // 存放结果集
@@ -262,7 +262,7 @@ class Solution {
262262
```
263263

264264
Python:
265-
```python3
265+
```py
266266
class Solution:
267267
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
268268
res = [] #存放结果集
@@ -284,6 +284,44 @@ class Solution:
284284

285285
Go:
286286

287+
javaScript:
288+
289+
```js
290+
// 等差数列
291+
var maxV = k => k * (9 + 10 - k) / 2;
292+
var minV = k => k * (1 + k) / 2;
293+
var combinationSum3 = function(k, n) {
294+
if (k > 9 || k < 1) return [];
295+
// if (n > maxV(k) || n < minV(k)) return [];
296+
// if (n === maxV(k)) return [Array.from({length: k}).map((v, i) => 9 - i)];
297+
// if (n === minV(k)) return [Array.from({length: k}).map((v, i) => i + 1)];
298+
299+
const res = [], path = [];
300+
backtracking(k, n, 1, 0);
301+
return res;
302+
function backtracking(k, n, i, sum){
303+
const len = path.length;
304+
if (len > k || sum > n) return;
305+
if (maxV(k - len) < n - sum) return;
306+
if (minV(k - len) > n - sum) return;
307+
308+
if(len === k && sum == n) {
309+
res.push(Array.from(path));
310+
return;
311+
}
312+
313+
const min = Math.min(n - sum, 9 + len - k + 1);
314+
315+
for(let a = i; a <= min; a++) {
316+
path.push(a);
317+
sum += a;
318+
backtracking(k, n, a + 1, sum);
319+
path.pop();
320+
sum -= a;
321+
}
322+
}
323+
};
324+
```
287325

288326

289327

0 commit comments

Comments
 (0)