新增132. 分割回文串 II JavaScript版本

This commit is contained in:
jerryfishcode
2021-09-27 23:51:56 +08:00
committed by GitHub
parent 4d4cd5bace
commit 6a9fa6713a

View File

@ -247,6 +247,42 @@ class Solution:
## JavaScript
```js
var minCut = function(s) {
const len = s.length;
// 二维数组isPalindromic来保存整个字符串的回文情况
const isPalindromic = new Array(len).fill(false).map(() => new Array(len).fill(false));
for(let i = len - 1; i >= 0; i--){
for(let j = i; j < len; j++){
if(s[i] === s[j] && (j - i <= 1 || isPalindromic[i + 1][j - 1])){
isPalindromic[i][j] = true;
}
}
}
// dp[i]:范围是[0, i]的回文子串最少分割次数是dp[i]
const dp = new Array(len).fill(0);
for(let i = 0; i < len; i++) dp[i] = i; // 初始化 dp[i]的最大值其实就是i也就是把每个字符分割出来
for(let i = 1; i < len; i++){
if(isPalindromic[0][i]){ // 判断是不是回文子串
dp[i] = 0;
continue;
}
/*
如果要对长度为[0, i]的子串进行分割分割点为j。
那么如果分割后,区间[j + 1, i]是回文子串那么dp[i] 就等于 dp[j] + 1。
这里可能有同学就不明白了,为什么只看[j + 1, i]区间,不看[0, j]区间是不是回文子串呢?
那么在回顾一下dp[i]的定义: 范围是[0, i]的回文子串最少分割次数是dp[i]。
[0, j]区间的最小切割数量我们已经知道了就是dp[j]。
此时就找到了递推关系当切割点j在[0, i] 之间时候dp[i] = dp[j] + 1;
本题是要找到最少分割次数所以遍历j的时候要取最小的dp[i]。dp[i] = Math.min(dp[i], dp[j] + 1);
*/
for(let j = 0; j < i; j++){
if(isPalindromic[j + 1][i]){
dp[i] = Math.min(dp[i], dp[j] + 1);
}
}
}
return dp[len - 1];
};
```
-----------------------