From 6a9fa6713a0259a0ff65b9ee10a9d25bb7dc8b3d Mon Sep 17 00:00:00 2001 From: jerryfishcode <91447694+jerryfishcode@users.noreply.github.com> Date: Mon, 27 Sep 2021 23:51:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E132.=20=E5=88=86=E5=89=B2?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E4=B8=B2=20II=20JavaScript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0132.分割回文串II.md | 36 ++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/problems/0132.分割回文串II.md b/problems/0132.分割回文串II.md index f9cbd618..4cf86496 100644 --- a/problems/0132.分割回文串II.md +++ b/problems/0132.分割回文串II.md @@ -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]; +}; ``` -----------------------