给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的最少分割次数。
示例:
输入: “aab”
输出: 1
解释: 进行一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。
思路
动态规划
简历数组dp
dp[i]表示前i个字母的最少分割次数,默认为i-1。
当s[a:b]==s[a:b][::-1]时,dp[b]=dp[a]+1
回文有两种情况字符数为奇数或偶数个,如‘aba’和‘bb’
代码
def minCut(self, s):
if s == s[::-1]: return 0
for i in range(1,len(s)):
if s[i:] == s[:i-1:-1] and s[:i] == s[i-1::-1]: return 1
dp = []
for i in range(-1,len(s)):
dp.append(i)
for i in range(len(s)):
t=0
while i-t >=0 and i+t<len(s) and s[i-t]==s[i+t]:
dp[i+t+1]= min(dp[i+t+1], dp[i-t] + 1)
t=t+1
t=0
while i-t>=0 and i+t+1<len(s) and s[i-t]==s[i+t+1]:
dp[i+t+2] = min(dp[i+t+2], dp[i-t]+1)
t=t+1
return dp[-1]