傳送門
給你乙個字串 s,請你將 s 分割成一些子串,使每個子串都是回文。示例 1:返回符合要求的 最少分割次數 。
輸入:s = "aab"示例 2:輸出:1
解釋:只需一次分割就可將 s 分割成 ["aa","b"] 這樣兩個回文子串。
輸入:s = "a"示例 3:輸出:0
輸入:s = "ab"輸出:1
1 <= s.length <= 2000
s 僅由小寫英文本母組成
int mincut(char * s)
設 f[i]f[i]f[i] 表示字串的字首 s[0..i]s[0..i]s[0..i] 的最少分割次數。要想得出 f[i]f[i]f[i] 的值,我們可以考慮列舉 s[0..i]s[0..i]s[0..i] 分割出的最後乙個回文串,這樣我們就可以寫出狀態轉移方程:
f[i]=min0≤j即我們列舉最後乙個回文串的起始位置 j+1j+1j+1,保證 s[j+1..i]s[j+1..i]s[j+1..i] 是乙個回文串,那麼 f[i]f[i]f[i] 就可以從 f[j]f[j]f[j] 轉移而來,附加 111 次額外的分割次數。
注意到上面的狀態轉移方程中,我們還少考慮了一種情況,即 s[0..i]s[0..i]s[0..i] 本身就是乙個回文串。此時其不需要進行任何分割,即:
f[i]=0f[i] = 0 f[i]=0
那麼我們如何知道 s[j+1..i]s[j+1..i]s[j+1..i] 或者 s[0..i]s[0..i]s[0..i] 是否為回文串呢?我們可以使用與「131. 分割回文串的官方題解」中相同的預處理方法,將字串 sss 的每個子串是否為回文串預先計算出來,即:
設 g(i,j)g(i, j)g(i,j) 表示 s[i..j]s[i..j]s[i..j] 是否為回文串,那麼有狀態轉移方程:力扣131 分割回文串
題目 給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回 s 所有可能的分割方案。示例 輸入 aab 輸出 aa b a a b 分析 有點向之前求所有子串問題,採用dp動態規劃演算法,只是多加上了判斷是否為回文串,在 aab 一例中可以依次分析如下分割是否滿足回文串特性 a a ...
132 分割回文串 II
給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回符合要求的最少分割次數。示例 輸入 aab 輸出 1 解釋 進行一次分割就可將 s 分割成 aa b 這樣兩個回文子串。解法一 public class solution else return dp 0 解法二 如果從分割字串的角...
132 分割回文串 II DP
給你乙個字串 s,請你將 s 分割成一些子串,使每個子串都是回文。返回符合要求的 最少分割次數 示例 1 輸入 s aab 輸出 1 解釋 只需一次分割就可將 s 分割成 aa b 這樣兩個回文子串。示例 2 輸入 s a 輸出 0 示例 3 輸入 s ab 輸出 1 分析 本題利用的最長上公升子串...