[LeetCode] Palindrome Partitioning II

Given a string s, partition s such that every substring of the partition is a palindrome.

Return the minimum cuts needed for a palindrome partitioning of s.

For example, given s = "aab",
Return 1 since the palindrome partitioning ["aa","b"] could be produced using 1 cut.

  给定一个字符串,返回最小回文分割次数。同上一题,此处也需要判定字符串是否是回文串,需要使用到DP算法来加速。

  考虑问题的主体:最小次数。给定一个字符串s,设最小分割函数为min_cut(),字符串s的最小分割串集合为{s}。{s}会对应有几个分割点,例如示例中的1cut,对应会有一个分割点。在这些分割点中任取一个点k,它会把s分割为s1,s2两个子串,同时也会把最小分割集合分成两部分{s1},{s2},则集合{s1}和{s2}必然也会是子串s1和s2的最小分割集合,且

  min_cut(s) = min_cut(s1) + min_cut(s2) + 1   (1)

证明可以使用反证法,如果{s1}不是s1的最小分割集合,则必然存在一个最小分割集合{s1}',用它替换{s1}在{s}中的位置,可以得到更优的最小分割集合{s}’。这与{s}是最小分割集合相矛盾。可以看出这是一个最有子结构问题,可以考虑使用DP来求解。

  综上所述,这里两次使用了DP算法,一次是在判断回文串,另一次是在找最小分割次数。

代码可以参考:http://www.cppblog.com/wicbnu/archive/2013/03/18/198565.html

转载于:https://www.cnblogs.com/CGwolke/p/3258487.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值