利用python 完成 leetcode132 分割回文串 II

给定一个字符串 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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值