力扣132 分割回文串 II C語言實現 困難題

2022-06-22 16:27:14 字數 1560 閱讀 9438

傳送門

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

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

示例 1:

輸入:s = "aab"

輸出:1

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

示例 2:

輸入:s = "a"

輸出:0

示例 3:

輸入: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]=min⁡0≤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 分析 本題利用的最長上公升子串...