python leetcode 132. Palindrome Partitioning II
阿新 • • 發佈:2018-12-14
思路:如果s[left:right]是迴文並且s[:left]也是迴文,那麼s[:right]即是一個分割。同理如果dp[left:right]是最小回文分割並且dp[:left]也是最小回文分割,那麼dp[:right]=dp[left:right]+dp[:left]。為了方便遍歷,這裡將dp[left:right]設定為1即s[left:right]是迴文。為了減少執行時間,增加一個判斷s[left:right]是否是迴文序列的二維陣列。
class Solution(object):
def minCut(self, s):
"""
:type s: str
:rtype: int
"""
#p[j][i] 判斷j-i是否是迴文序列 dp[i]0~i的最少分割
ls=len(s)
dp=[0]*(ls+1)
dp[0]=-1
p=[[False]*ls for i in range(ls)]
for i in range(ls):
dp[i+1]=i
for i in range(ls):
for j in range(i+1):
if s[j]==s[i] and ((i-j<2) or p[j+1][i-1]):
p[j][i]=True
dp[i+1]=min(1+dp[j],dp[i+1])
return dp[ls]