LeetCode132 分割回文串(DP 回文)

2022-06-26 01:27:10 字數 1446 閱讀 3992

解題思路:有兩個問點: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*n的複雜度內完成。

針對問點2,本人一開始想的是乙個(n*n*n)的演算法,設定二維dp陣列 dp[i][j]表示索引i為起點,j為結束位置的字串的最小分割次數。列舉(i,j)區間,從而得到dp[0][n-1]的值,但是仔細觀察,似乎可以去掉乙個維度,設定一維dp陣列 dp[i]表示以0為起點,i為結束位置的字串的最小分割次數,列舉(0,i)區間,從而得到dp[n-1]的值,時間複雜度(n*n),於是得到狀態轉移方程 如果a[k][i]是回文串,那麼dp[i] = max(dp[i],dp[k]+0+1),因為最終的分割次數,一定是和分割點的個數相同,即只有a[k][i]是回文串的時候才可能有狀態轉移。

1

class

solution:

2def

mincut(self, s):

3 length =len(s)

4 is_hui = [[0]*length for i in

range(length)]

5for i in range(length-1,-1,-1):

6for j in range(0,length,1):

7if i >=j:

8 is_hui[i][j] = 1

9else

:10 is_hui[i][j] = is_hui[i+1][j-1] and (s[i]==s[j])

11 inf = int(1e9)

12 dp = [inf for i in

range(length)]

13for i in

range(length):

14if

is_hui[0][i]:

15 dp[i] =016#

print(dp)

17for i in

range(length):

18for k in

range(0,i):

19if is_hui[k+1][i]:

20 dp[i] = min(dp[i],dp[k]+1)21#

print(dp)

22return dp[-1]

leetcode132 分割回文串II

給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回符合要求的最少分割次數。示例 輸入 aab 輸出 1 解釋 進行一次分割就可將 s 分割成 aa b 這樣兩個回文子串。01揹包 給定num個物品,每種物品都有自己的重量 wi 和價值 vi,且都為整數,在限定的總重量weight內...

leetcode132分割回文字串

給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回符合要求的最少分割次數。示例 輸入 aab 輸出 1 解釋 進行一次分割就可將 s 分割成 aa b 這樣兩個回文子串。1.遞迴 回溯 記錄每一次分割所需要的次數,求最小值 如下 class solution void dfs st...

leetcode 132 分割回文串II

1 今天的題目困難,顯然我又不會做 2 在昨天官方答案基礎上稍微做了改動。還是貼出官方答案吧。3 題目思路 求最小的分割次數,既然是分割回文串ii必然和分割回文串i有相通之處,還記得昨天的採用動態規劃嘛,所以可以求解f i 最小分割次數,f i 為s 0 i 之間的最小分割次數,求解f i 考慮列舉...