力扣的 分割回文串 II 解法 (Python3)

2021-10-04 13:25:44 字數 2465 閱讀 1308

題目描述:

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

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

示例:輸入: 「aab」

輸出: 1

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

class

solution

:def

mincut

(self, s:

str)

->

int:

ls =

len(s)

if ls <2:

return

0 dp =

[i for i in

range

(ls)

] check_palindrome =[[

false

for _ in

range

(ls)

]for _ in

range

(ls)

]for i in

range

(ls)

:for j in

range

(i +1)

:if s[j]

== s[i]

and(i - j <=

2or check_palindrome[j +1]

[i -1]

):check_palindrome[j]

[i]=

true

for i in

range(1

, ls)

:if check_palindrome[0]

[i]:

dp[i]=0

continue

# 列舉分割點

dp[i]

=min

([dp[j]+1

for j in

range

(i)if check_palindrome[j +1]

[i]]

)return dp[ls -

1]

執行結果1:

參考程式2:

class

solution

:def

mincut

(self, s:

str)

->

int:

mincut =

list

(range

(len

(s))

) ls =

len(s)

dp =[[

false

]* ls for _ in

range

(ls)

]for j in

range

(ls)

:for i in

range

(j+1):

if s[i]

== s[j]

and(j - i <

2or dp[i +1]

[j -1]

):dp[i]

[j]=

true

if i ==0:

mincut[j]=0

else

: mincut[j]

=min

(mincut[j]

, mincut[i -1]

+1)return mincut[-1

]

執行結果2:

參考程式3:

class

solution

:def

mincut

(self, s:

str)

->

int:

iflen

(s)<2:

return

0 mincut =

[index for index in

range(-

1,len(s))]

for i in

range(1

,len

(s)+1)

:for j in

range

(i):

if s[j:i]

== s[j:i][:

:-1]

: mincut[i]

=min

(mincut[i]

, mincut[j]+1

)return mincut[-1

]

力扣131 分割回文串

題目 給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回 s 所有可能的分割方案。示例 輸入 aab 輸出 aa b a a b 分析 有點向之前求所有子串問題,採用dp動態規劃演算法,只是多加上了判斷是否為回文串,在 aab 一例中可以依次分析如下分割是否滿足回文串特性 a a ...

21 3 8 力扣每日刷題 分割回文串

給你乙個字串 s,請你將 s 分割成一些子串,使每個子串都是回文。返回符合要求的 最少分割次數 示例 1 輸入 s aab 輸出 1 解釋 只需一次分割就可將 s 分割成 aa b 這樣兩個回文子串。示例 2 輸入 s a 輸出 0 示例 3 輸入 s ab 輸出 1 1 s.length 2000...

132 分割回文串 II

給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回符合要求的最少分割次數。示例 輸入 aab 輸出 1 解釋 進行一次分割就可將 s 分割成 aa b 這樣兩個回文子串。解法一 public class solution else return dp 0 解法二 如果從分割字串的角...