刷题路程|leetcode:palindrome-partioning-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",
Return1since the palindrome partitioning["aa","b"]could be produced using 1 cut.

解题思路

本题所使用的方法是动态规划。用一个数组,mc[]来保存从第0个字符到当前字符的最小切割数,比如,mc[j]表示0到j之间的字符串的最小切割数。

注意以下几点

  • 当s[i..j]是回文串时,mc[j]=min(mc[i-1]+1,mc[j])。mc[i-1]+1,很好理解,就是前一个回文串的最小切割加上1个切割。可为什么要与mc[j]比较取最小值呢?因为,mc[j]中保存着到j这个字符的不同切割方法的最小切割数,也就是无论怎样,mc[j]中的值都是表示0到j之间的字符串的最小切割数(目前为止的),所以要和它比较,如果比它还小,就把mc[j]值更新成更小的。
  • 当s[i...j]不是回文串时,那么mc[j]=min(mc[j-1]+1,mc[j])。mc[j-1]表示到上一个字符的最小切割,到下一个字符不是回文,就把下一个字符单独拿出作为回文,把到上一个字符最小切割数加上1,作为到这个字符的最小切割数。mc[j]的解释和上一点相同。
  • 最后一个mc[s.size()-1]是整个串的最小切割数。

解题代码

class Solution {
    bool isPal(string s,int left,int right){

        for(int i=left,j=right;i<j;i++,--j){
                //cout<<*i<<" "<<*j<<endl;
            if(s[i]!=s[j]) return false;

        }
        return true;
    }
public:
    int minCut(string s) {

        vector<int> mc(s.size(),0);
        for(int i=0;i<s.size();++i){
            //mc[i]=mc[i-1]+1;
            for(int j=i;j<s.size();++j){
                    //mc[j]=m[i]+1;
                if(i>0){
                    if(isPal(s,i,j)){
                        mc[j]=min(mc[j],mc[i-1]+1);
                    }else{
                        mc[j]=min(mc[j],mc[j-1]+1);
                    }
                }else{
                    if(isPal(s,i,j)){
                        mc[j]=0;
                    }else{
                        mc[j]=mc[j-1]+1;
                    }
                }
            }
        }
        return mc[s.size()-1];
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 6,493评论 1 42
  • 132. Palindrome Partitioning II 这道题考的是怎么用dp来解决dfs的问题如果仅使用...
    Isabella10阅读 1,937评论 0 0
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    叶总韩阅读 5,168评论 0 41
  • 分治方法 将问题划分成互不相交的子问题 递归地求解子问题 将子问题的解组合起来 动态规划(两个要素:最优子结构、子...
    superlj666阅读 535评论 0 0