diff --git a/problems/0047.全排列II.md b/problems/0047.全排列II.md
index cce25cd9..f635b8de 100644
--- a/problems/0047.全排列II.md
+++ b/problems/0047.全排列II.md
@@ -268,7 +268,7 @@ var permuteUnique = function (nums) {
function backtracing( used) {
if (path.length === nums.length) {
- result.push(path.slice())
+ result.push([...path])
return
}
for (let i = 0; i < nums.length; i++) {
@@ -303,7 +303,7 @@ function permuteUnique(nums: number[]): number[][] {
return resArr;
function backTracking(nums: number[], route: number[]): void {
if (route.length === nums.length) {
- resArr.push(route.slice());
+ resArr.push([...route]);
return;
}
for (let i = 0, length = nums.length; i < length; i++) {
diff --git a/problems/0647.回文子串.md b/problems/0647.回文子串.md
index 913aec65..6045ba7b 100644
--- a/problems/0647.回文子串.md
+++ b/problems/0647.回文子串.md
@@ -406,6 +406,63 @@ const countSubstrings = (s) => {
}
```
+TypeScript:
+
+> 动态规划:
+
+```typescript
+function countSubstrings(s: string): number {
+ /**
+ dp[i][j]: [i,j]区间内的字符串是否为回文(左闭右闭)
+ */
+ const length: number = s.length;
+ const dp: boolean[][] = new Array(length).fill(0)
+ .map(_ => new Array(length).fill(false));
+ let resCount: number = 0;
+ // 自下而上,自左向右遍历
+ for (let i = length - 1; i >= 0; i--) {
+ for (let j = i; j < length; j++) {
+ if (
+ s[i] === s[j] &&
+ (j - i <= 1 || dp[i + 1][j - 1] === true)
+ ) {
+ dp[i][j] = true;
+ resCount++;
+ }
+ }
+ }
+ return resCount;
+};
+```
+
+> 双指针法:
+
+```typescript
+function countSubstrings(s: string): number {
+ const length: number = s.length;
+ let resCount: number = 0;
+ for (let i = 0; i < length; i++) {
+ resCount += expandRange(s, i, i);
+ resCount += expandRange(s, i, i + 1);
+ }
+ return resCount;
+};
+function expandRange(s: string, left: number, right: number): number {
+ let palindromeNum: number = 0;
+ while (
+ left >= 0 && right < s.length &&
+ s[left] === s[right]
+ ) {
+ palindromeNum++;
+ left--;
+ right++;
+ }
+ return palindromeNum;
+}
+```
+
+
+
-----------------------
diff --git a/problems/回溯算法去重问题的另一种写法.md b/problems/回溯算法去重问题的另一种写法.md
index f48097e1..cbfe046a 100644
--- a/problems/回溯算法去重问题的另一种写法.md
+++ b/problems/回溯算法去重问题的另一种写法.md
@@ -365,6 +365,84 @@ class Solution:
return res
```
+JavaScript:
+
+**90.子集II**
+
+```javascript
+function subsetsWithDup(nums) {
+ nums.sort((a, b) => a - b);
+ const resArr = [];
+ backTraking(nums, 0, []);
+ return resArr;
+ function backTraking(nums, startIndex, route) {
+ resArr.push([...route]);
+ const helperSet = new Set();
+ for (let i = startIndex, length = nums.length; i < length; i++) {
+ if (helperSet.has(nums[i])) continue;
+ helperSet.add(nums[i]);
+ route.push(nums[i]);
+ backTraking(nums, i + 1, route);
+ route.pop();
+ }
+ }
+};
+```
+
+**40. 组合总和 II**
+
+```javascript
+function combinationSum2(candidates, target) {
+ candidates.sort((a, b) => a - b);
+ const resArr = [];
+ backTracking(candidates, target, 0, 0, []);
+ return resArr;
+ function backTracking( candidates, target, curSum, startIndex, route ) {
+ if (curSum > target) return;
+ if (curSum === target) {
+ resArr.push([...route]);
+ return;
+ }
+ const helperSet = new Set();
+ for (let i = startIndex, length = candidates.length; i < length; i++) {
+ let tempVal = candidates[i];
+ if (helperSet.has(tempVal)) continue;
+ helperSet.add(tempVal);
+ route.push(tempVal);
+ backTracking(candidates, target, curSum + tempVal, i + 1, route);
+ route.pop();
+ }
+ }
+};
+```
+
+**47. 全排列 II**
+
+```javaescript
+function permuteUnique(nums) {
+ const resArr = [];
+ const usedArr = [];
+ backTracking(nums, []);
+ return resArr;
+ function backTracking(nums, route) {
+ if (nums.length === route.length) {
+ resArr.push([...route]);
+ return;
+ }
+ const usedSet = new Set();
+ for (let i = 0, length = nums.length; i < length; i++) {
+ if (usedArr[i] === true || usedSet.has(nums[i])) continue;
+ usedSet.add(nums[i]);
+ route.push(nums[i]);
+ usedArr[i] = true;
+ backTracking(nums, route);
+ usedArr[i] = false;
+ route.pop();
+ }
+ }
+};
+```
+
TypeScript:
**90.子集II**
@@ -376,7 +454,7 @@ function subsetsWithDup(nums: number[]): number[][] {
backTraking(nums, 0, []);
return resArr;
function backTraking(nums: number[], startIndex: number, route: number[]): void {
- resArr.push(route.slice());
+ resArr.push([...route]);
const helperSet: Set = new Set();
for (let i = startIndex, length = nums.length; i < length; i++) {
if (helperSet.has(nums[i])) continue;
@@ -403,7 +481,7 @@ function combinationSum2(candidates: number[], target: number): number[][] {
) {
if (curSum > target) return;
if (curSum === target) {
- resArr.push(route.slice());
+ resArr.push([...route]);
return;
}
const helperSet: Set = new Set();
@@ -430,7 +508,7 @@ function permuteUnique(nums: number[]): number[][] {
return resArr;
function backTracking(nums: number[], route: number[]): void {
if (nums.length === route.length) {
- resArr.push(route.slice());
+ resArr.push([...route]);
return;
}
const usedSet: Set = new Set();