码迷,mamicode.com
首页 > 其他好文 > 详细

【LeetCode】Palindrome Partitioning II

时间:2014-09-19 22:21:56      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   ar   strong   for   2014   

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.

 

这题肯定是用动态规划来做的。

——————>

当然递归也能做,每一次划分为两个子串,得到与原问题完全一致的子问题。

终止条件为得到回文串。所求的最小切分数即最大递归深度。

TLE是意料之中的。

<——————

显而易见的是需要开辟二维数组isPar,用于存储已经确定的回文子串。isPar[i][j]==true代表s[i,...,j]是回文串。

然后还需要一个递推过程,从前往后还是从后往前是对称的,以从后往前为例。

开辟一维数组mCut,mCut[i]意为s[i,...,n-1]的最小切分数。

在此有几个关键点说明一下,详细可以看代码和注释:

1、mCut[i]初始化为mCut[i+1]+1,即初始化s[i]与s[i+1]之间需要切一刀。注意边界。

2、从i到n-1中间如果存在位置j,同时满足:(1)s[i,...,j]为回文串;(2)1+mCut[j+1] < mCut[i]。

那么mCut[i]=1+mCut[j+1],也就是说一刀切在j的后面比切在i的后面要好。

这个过程很像Dijkstra算法:d(u,v)+d(v,w)<d(u,w) --> d(u,w)=d(u,v)+d(v,w)

 

class Solution 
{
public:

    int minCut(string s) 
    {
        int n = s.size();

        //n*n的二维数组,isPar[i][j]代表s[i,...,j]是否为回文字符串
        //初始化方式为,isPar由n个vector<bool>元素构成,每个vector<bool>由n个false构成
        vector<vector<bool> > isPar(n, vector<bool>(n,false));
        for(int i = 0; i < n; i ++)
            isPar[i][i] = true;

        //mCut[i]代表s[i,...,n-1]的minCut数
        vector<int> mCut(n);            

        for(int i = n-1; i >= 0; i --)
        {
            //mCut[i]初始化为后一位的切分数加1
            mCut[i] = (i==n-1) ? 0:mCut[i+1]+1;

            for(int j = i+1; j < n; j ++)
            {
                if(s[i] == s[j])
                {
                    //更新isPar[i][j]与mCut[i]
                    if(j == i+1 || isPar[i+1][j-1] == true)
                    {
                        isPar[i][j] = true;
                        if(j == n-1)
                            mCut[i] = 0;
                        //[i,..,j]一次cut,[j+1,...,n-1]有mCut[j+1]次cut
                        else if(1+mCut[j+1] < mCut[i])
                            mCut[i] = 1+mCut[j+1];
                    }
                }
            }
        }

        return mCut[0];
    }
};

bubuko.com,布布扣

【LeetCode】Palindrome Partitioning II

标签:style   blog   http   color   io   ar   strong   for   2014   

原文地址:http://www.cnblogs.com/ganganloveu/p/3982561.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!