132 分割回文串 II DP

2021-10-21 10:29:04 字數 1225 閱讀 7768

給你乙個字串 s,請你將 s 分割成一些子串,使每個子串都是回文。

返回符合要求的 最少分割次數 。

示例 1:

輸入:s = 「aab」

輸出:1

解釋:只需一次分割就可將 s 分割成 [「aa」,「b」] 這樣兩個回文子串。

示例 2:

輸入:s = 「a」

輸出:0

示例 3:

輸入:s = 「ab」

輸出:1

分析:本題利用的最長上公升子串行的dp遞推公式,這裡不過變成了求最小次數,把前面每個子字串的最小分割次數記錄到dp陣列中,比如aab這種情況,dp[1] (對應a),dp[2](對應aa),都是0,到了dp[3] (對應aab)情況時,自己預設最多劃分2次,然後參考了aa只需要劃分0次,多的自己再多劃分1次,這樣總共1次就可以了,所以遞推式子為dp[i] = min(dp[i], dp[j] + 1)

為了方便判斷條件的直接運用,可以先構造描述字串s中任意兩個子字串(s[i]到s[j])是否為回文的的二維陣列ispalindromic,構造的順序如下圖所示

注釋**如下:

class

solution}}

// 初始化dp陣列

vector<

int>

dp(s.

size()

+1,0

);for(

int i =

0; i < s.

size()

; i++

) dp[i]

= i;

//模擬最長上公升子串行和套娃思想,每個新加入乙個元素的字串去遍歷之前的

for(

int i =

1; i < s.

size()

; i++

)// 對應ispalindromic豎著找第i列的情況,過一遍前面[0,j]的子串需要多少次劃分

132 分割回文串 II

給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回符合要求的最少分割次數。示例 輸入 aab 輸出 1 解釋 進行一次分割就可將 s 分割成 aa b 這樣兩個回文子串。解法一 public class solution else return dp 0 解法二 如果從分割字串的角...

132 分割回文串 II

給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回符合要求的最少分割次數。示例 輸入 aab 輸出 1 解釋 進行一次分割就可將 s 分割成 aa b 這樣兩個回文子串。1.我最開始想到了要兩次dp,先算乙個是否是回文數的dp陣列,再算所求的dp。但第二個dp陣列我用的二維陣列,然...

LeetCode132 分割回文串(DP 回文)

解題思路 有兩個問點 1 如何快速當前字串哪些的字串是回文 2 如何組合這些字串達到分割次數最少 針對問點1,可以開闢乙個二維布林陣列 a,a i j 表示以索引i為起點,j為結束位置的字串是否是回文串。那麼有遞推公式a i j a i 1 j 1 s i s j i j 不難發現 a 陣列可以在n...