leetcode132 分割回文串II

2021-10-03 21:29:20 字數 2262 閱讀 9465

給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回符合要求的最少分割次數。

示例:輸入: 「aab」

輸出: 1

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

01揹包

給定num個物品,每種物品都有自己的重量 wi 和價值 vi,且都為整數,在限定的總重量weight內,選擇其中若干個,設計選擇方案使得物品的總價值最高。01揹包是指每個物品只能使用一次。這類揹包問題我們首先要建立乙個二維陣列dp,其中dp[i][j]表示前i件物品在重量不超過j的前提下的最大價值,其中i從1開始,j也從1開始。狀態轉移:

1 第 i 件物品沒新增到揹包時,總重量不超過 j 的前 i 件物品的最大價值就是總重量不超過 j 的前 i-1 件物品的最大價值,即dp[i][j] = dp[i-1][j]。

2 第 i 件物品新增到揹包時,前i-1件物品總重不超過j-w[i]時的最大價值的基礎上加上v[i],即dp[i][j] = dp[i-1][j-wi] + vi

以上兩種情況的選擇取決於誰的價值更大,dp[i][j]= max(dp[i-1][j], dp[[i-1][j-wi]+vi)

邊界條件:

dp[0, j],不管j是多少,肯定為0,因為它表示我們乙個物品都不選擇的情況

dp[i, 0],當我們總重量限制為0時,肯定價值為0

num =

5weight =

10w =[2

,2,6

,5,4

]v =[6

,3,5

,4,6

]# 遞推的時候會用到邊界條件,所以dp的num維上的元素數目要多乙個,表示乙個物體都不選的情況,

# weight維度上面也要多乙個,表示總重量為0的情況

dp =[[

0]*(weight +1)

for _ in

range

(num +1)

]# 依次遍歷num個物品,即從1到num

for i in

range(1

, num+1)

:# 從1開始遞增總重量直到weight

for j in

range(1

, weight+1)

:if w[i-1]

> j:

dp[i]

[j]= dp[i-1]

[j]else

: dp[i]

[j]=

max(dp[i-1]

[j], dp[i-1]

[j-w[i-1]

]+v[i-1]

)print

(dp[num]

[weight]

)# 15

該問題中,設dp[j]為s[:j+1]的最小分割數目,設0<=i<=j,那麼,如果i至j的字串s[i:j+1]為回文,則最小的分割為在dp[i-1]的基礎上+1。由於可能存在多個j使s[i:j+1]為回文,所以,遞推公式為:dp[j]=min(dp[i-1]+1) for i in range(j+1) if s[i:j+1]為回文)

class

solution

:def

mincut

(self, s:

str)

->

int:

n =len(s)

mem =[[

0]*n for _ in

range

(n)]

dp =[0

]*nfor j in

range

(n):

# min_cut 為s[:j+1]的最小分割數目dp[j],該值最大情況為j,最小為0

min_cut = j

for i in

range

(j+1):

if s[i]

== s[j]

and(

(j-i<=2)

or mem[i+1]

[j-1])

: mem[i]

[j]=

1if i ==0:

min_cut =

0else

: min_cut =

min(min_cut, dp[i-1]

+1) dp[j]

= min_cut

return dp[-1

]

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 考慮列舉...

leetCode 132 分割回文串 II

需要進行兩次動態規化,第一次動態規化計算f i j 也就是s i,j 是否是回文串。第二次動態規化設定g i 代表s 0,i 的最小分割次數,如果s 0,i 是回文串,則g i 0,如果不是回文串則 g i g j 1,0 j i,s j 1,i 是回文串。class solution for in...