Hard-题目40:132. Palindrome Partitioning II

转载 2016年05月31日 23:49:00

题目原文:
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.
题目大意:
给出一个字符串s,求出最小的切分数使得切分后的每个子串都是回文的。
题目分析:
我还是不会,摘抄大神的博客如下:
从后往前构造二维数组isPalin,用于存储已经确定的回文子串。isPalin[i][j]==true代表s[i,…,j]是回文串。
在构造isPalin的同时使用动态规划计算从后往前的最小切分数,记录在min数组中。min[i]代表s[i,…,n-1]的最小切分数。
(上述两步分开做会使得代价翻倍,容易TLE)
关键步骤:
1、min[i]初始化为min[i+1]+1,即初始化s[i]与s[i+1]之间需要切一刀。这里考虑边界问题,因此min数组设为n+1长度。
2、从i到n-1中间如果存在位置j,同时满足:(1)s[i,…,j]为回文串;(2)1+min[j+1] < min[i]。
那么min[i]=1+min[j+1],也就是说一刀切在j的后面比切在i的后面要好。
源码:(language:cpp)

class Solution {
public:
    int minCut(string s) {
        int n = s.size();
        vector<vector<bool> > isPalin(n, vector<bool>(n, false));
        vector<int> min(n+1, -1); //min cut from end

        for(int i = 0; i < n; i ++)
        {
            isPalin[i][i] = true;
        }

        for(int i = n-1; i >= 0; i --)
        {
            min[i] = min[i+1] + 1;
            for(int j = i+1; j < n; j ++)
            {
                if(s[i] == s[j])
                {
                    if(j == i+1 || isPalin[i+1][j-1] == true)
                    {
                        isPalin[i][j] = true;
                        if(j == n-1)
                            min[i] = 0;
                        else if(min[i] > min[j+1]+1)
                            min[i] = min[j+1] + 1;
                    }
                }
            }
        }

        return min[0];
    }
};

成绩:
80ms,45.15%,12ms,16.23%

动态规划——回文最小分割数(palindrome-partitioning-ii)

题目: 给定一个字符串str,返回把str全部切成回文子串的最小分割数。 举例: str="ABA" ,不需要切割,返回0; str="ACDCDCDAD",最少需要切两次,比如"A"...
  • jingsuwen1
  • jingsuwen1
  • 2016年07月17日 21:06
  • 6692

【LeetCode】- Valid Palindrome(正确的回文)

[ 问题: ] Given a string, determine if it is a palindrome, considering only alphanumeric characters a...
  • zdp072
  • zdp072
  • 2014年08月28日 08:46
  • 3192

Palindrome Partitioning I 和II的代码和理解(动态规划思想)

Palindrome Partitioning I 和II的代码和理解(动态规划思想)
  • zhangbo_0323
  • zhangbo_0323
  • 2017年04月12日 20:48
  • 96

总结最长回文子串的几种做法 Longest Palindrome Substring

题目是:找出一个字符串中的最长回文子串。 例如:abcbcbb 的最长回文子串是 bcbcb 首先一种常见的错误方法是把原字符串S倒转过来成为S‘,以为这样就将问题转化成为了求S和S’的最长公共子串的...
  • hellobinfeng
  • hellobinfeng
  • 2014年03月16日 03:21
  • 2999

[leetcode]Valid Palindrome (判断回文数 C语言实现)

Valid Palindrome Given a string, determine if it is a palindrome, considering only alphanumeric ch...
  • sanmao0816
  • sanmao0816
  • 2015年03月26日 15:37
  • 905

1-11-6 - (2)定义ispalindrome函数(判断输入数据是否回文)

问题及代码:   运行结果: 知识点总结: 学习小结:
  • hexiaole1994
  • hexiaole1994
  • 2014年11月10日 11:17
  • 1109

五十道编程小题目 --- 40 字符串排序 java

【程序40】  题目:字符串排序。  import java.util.ArrayList; import java.util.HashMap; import java.util.Scanner...
  • wangnanwlw
  • wangnanwlw
  • 2016年09月09日 15:12
  • 515

分割成回文需要的最小分割数 Palindrome Partitioning II @LeetCode

两个DP,用DFS肯定通不过。 参考:http://yucoding.blogspot.com/2013/08/leetcode-question-133-palindrome.html ...
  • hellobinfeng
  • hellobinfeng
  • 2014年01月01日 07:42
  • 2478

【LeetCode-面试算法经典-Java实现】【125-Valid Palindrome(回文字验证)】

【125-Valid Palindrome(回文字验证)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a string, determine if it i...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月14日 06:18
  • 2288

Palindrome Partitioning II(找给定字符串分割次数获取回文字串, 动态规划)

/*** Palindrome Partitioning IIMar 19518 / 34344 Given a string s, partition s such that every subst...
  • xiehaoyun2012
  • xiehaoyun2012
  • 2013年07月23日 01:21
  • 458
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hard-题目40:132. Palindrome Partitioning II
举报原因:
原因补充:

(最多只允许输入30个字)