[C++] LeetCode 132. 分割回文串 II

5人阅读 评论(0) 收藏 举报
分类:

题目

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 符合要求的的最少分割次数。
例如,给出 s = "aab",
返回 1 因为进行一次分割可以将字符串 s 分割成 ["aa","b"] 这样两个回文子串。

题解

这题有两种解法,但是都是采用动态规划。数组nums[i]表示前i字符串最小的分割次数,那么在遍历过程中需要知道ji的字符串是否为回文串。

方法一

先用动态规划,用一个二维数组flag[i][j]表示字符串第j个到第i个是否为回文串。然后再用一次动态规划,得出最小分割次数。但是时间复杂度较高。
代码如下:

class Solution {
public:
    int minCut(string s) {
        if(s.size()==0) return 0;
        int len=s.size();
        vector<vector<bool>> flag(len,vector<bool>(len,false));
        for(int k=0;k<len;k++){
            for(int i=0,j=k;j<len;i++,j++){
                if(i==j) flag[i][j]=true;
                else if(s[i]==s[j]){
                    if(i==j-1) flag[i][j]=true;
                    else if(flag[i+1][j-1]) flag[i][j]=true;
                    else flag[i][j]=false;
                }
                else{
                    flag[i][j]=false;
                }
            }
        }
        vector<int> nums(len,len-1);
        nums[0]=0;
        for(int i=1;i<len;i++){
            if(flag[0][i]==true){
                nums[i]=0;
                continue;
            }
            for(int j=i-1;j>=0;j--){
                if(flag[j+1][i]==false) continue;
                nums[i]=min(nums[i],nums[j]+1);
                if(nums[i]==1) break;
            }
        }
        return nums[len-1];
    }
};

方法二

这种方法是以一个字符为中心,向两边扩展,如果是回文串就更新最小分割次数,但是回文串可能是偶数个,也可能是奇数个。所以需要考虑以当前字符为中心,或者以当前字符以及当前字符下一个字符共同为中心,进行两边扩展。如果为回文串,则更新最小分割数
代码如下:

class Solution {
public:
    int minCut(string s) {
        if(s.size()==0) return 0;
        int len=s.size();
        vector<int> nums(len+1,0);
        for(int i=0;i<=len;i++) nums[i]=i-1;
        for(int i=1;i<=len;i++){
            for(int j=0;j<i&&i+j<=len&&s[i-j-1]==s[i+j-1];j++){
                nums[i+j]=min(nums[i+j],nums[i-j-1]+1);
            }
            for(int j=0;i-j>0&&i+j+1<=len&&s[i-1]==s[i]&&s[i-j-1]==s[i+j];j++){
                nums[i+j+1]=min(nums[i+j+1],nums[i-j-1]+1);
            }
        }
        return nums[len];
    }
};
查看评论

【LeetCode】132. Palindrome Partitioning II 基于动态规划DP、C++、Java的分析及解法

132. Palindrome Partitioning II Total Accepted: 50256 Total Submissions: 230441 Difficulty: Hard ...
  • Jin_Kwok
  • Jin_Kwok
  • 2016-05-16 20:29:43
  • 920

LintCode: 分割回文串 II

分割回文串 II  描述 笔记  数据  评测 给定一个字符串s,将s分割成一些子串,使每个子串都是回文。 返回s符合要求的的最少分割次数。 您在真实的面试中是否遇到过这个题?...
  • zyf19930610
  • zyf19930610
  • 2016-11-22 20:28:21
  • 173

Leetcode(132) Palindrome Partitioning II

题目如下: Given a string s, partition s such that every substring of the partition is a palindrome. Retu...
  • feliciafay
  • feliciafay
  • 2014-12-17 03:47:14
  • 1080

lintode(108)分割回文串 II

描述: 给定一个字符串s,将s分割成一些子串,使每个子串都是回文。 返回s符合要求的的最少分割次数。 样例: 比如,给出字符串s = "aab", 返回 1, 因...
  • sunday0904
  • sunday0904
  • 2017-04-22 14:23:24
  • 255

LeetCode 132 Palindrome Partitioning II (动态规划)

LeetCode 132 Palindrome Partitioning II (动态规划)
  • Tc_To_Top
  • Tc_To_Top
  • 2016-10-23 11:59:51
  • 766

[C++]LeetCode: 121 Palindrome Partitioning (分割回文子串 回溯法)

题目: Given a string s, partition s such that every substring of the partition is a palindrome. ...
  • cinderella_niu
  • cinderella_niu
  • 2015-01-25 15:57:02
  • 1258

LeetCode OJ 之 Word Search II (单词搜索 - 二)

题目: Given a 2D board and a list of words from the dictionary, find all words in the board. Each w...
  • u012243115
  • u012243115
  • 2015-08-03 14:28:48
  • 750

108 - 分割回文串 II

2017.10.24 理论上应该是很简单的   d[i][j] = min(d[i][k]+d[k+1][j]+1,d[i][j],但是如果单纯使用递归的话,显然会超时的。 后来采用数组记录d[i...
  • Missbubu
  • Missbubu
  • 2017-10-24 08:54:41
  • 94

[LeetCode]—Palindrome Partitioning II 回文分割,求最小分割数

Palindrome Partitioning II   Given a string s, partition s such that every substring of the ...
  • SUN20082567
  • SUN20082567
  • 2014-08-13 14:38:48
  • 780

LeetCode(Palindrome Partitioning) 将字符串分割成回文字符串

题目要求: Given a string s, partition s such that every substring of the partition is a palindrome....
  • lqcsp
  • lqcsp
  • 2014-04-08 10:51:56
  • 511
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 1万+
    积分: 965
    排名: 5万+
    博客专栏
    最新评论