解題思路:有兩個問點: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]是回文串的時候才可能有狀態轉移。
1class
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 考慮列舉...