mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
新增132. 分割回文串 II JavaScript版本
This commit is contained in:
@ -247,6 +247,42 @@ class Solution:
|
|||||||
## JavaScript
|
## JavaScript
|
||||||
|
|
||||||
```js
|
```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];
|
||||||
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
|
Reference in New Issue
Block a user