題目描述:
給定乙個字串 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 解法二 如果從分割字串的角...