zoukankan      html  css  js  c++  java
  • leetcode 131. Palindrome Partitioning 、132. Palindrome Partitioning II

    131. Palindrome Partitioning 

    一个字符串,通过不同的切分找到所有切分后的子字符串都是回文的可能性

    substr使用的是坐标值,不使用.begin()、.end()这种迭代器

    使用dfs,类似于subsets的题,每次判断要不要加入这个数

    start每次是起始的位置,判断当前位置到起始位置是不是回文

    class Solution {
    public:
        vector<vector<string>> partition(string s) {
            vector<vector<string> > result;
            if(s.empty())
                return result;
            vector<string> res;
            int start = 0;
            partition(s,result,res,start);
            return result;
        }
        void partition(string s,vector<vector<string>>& result,vector<string>& res,int start){
            if(start == s.size()){
                result.push_back(res);
                return;
            }
            for(int i = start;i < s.size();i++){
                if(!ispalindrome(s,start,i))
                    continue;
                res.push_back(s.substr(start,i - start + 1));
                partition(s,result,res,i+1);
                res.pop_back();
            }
        }
        
        bool ispalindrome(string s,int start,int end){
            while(start < end){
                if(s[start++] != s[end--])
                    return false;
            }
            return true;
        }
    };

    132. Palindrome Partitioning II

    切分字符串,找到最小切分次数让所有的子字符串都是回文

    这种方法是否回文和dp一起做了。dp[i]表示当前位置最小的切分次数。

    每次先初始化先初始化为要切分i次,然后从前往后找,找到符合的然后更新最小值 

    class Solution {
    public:
        int minCut(string s) {
            int n = s.size();
            vector<int> dp(n);
            vector<vector<bool> > flag(n,vector<bool>(n));
            for(int i = 0;i < n;i++){
                dp[i] = i;
                for(int j = 0;j <= i;j++){
                    if(s[i] == s[j] && (i - j < 2 ||flag[i-1][j+1])){
                        flag[i][j] = true;
                        dp[i] = j == 0 ? 0 :min(dp[i],dp[j-1] + 1);
                    }
                }
            }
            return dp[n-1];
        }
    };

    老方法,这种方法是把所有子串的回文串先存储起来,然后再进行dp

    class Solution {
    public:
        int minCut(string s) {
            int length = s.length();
            if(length <= 0)
                return 0;
            vector<vector<bool>> flag(length+1,vector<bool>(length+1));
            for(int i = 1;i <= length;i++){
                flag[i][i] = true;
                if(i < length){
                    if(s[i-1] == s[i])
                        flag[i][i+1] = true;
                    else
                        flag[i][i+1] = false;
                }
            }
            for(int j = 1;j <= length-2;j++){
                for(int k = 1;k <= length-j-1;k++){
                    if(s[k-1] == s[k+j] && flag[k+1][k+j] == true)
                        flag[k][k+j+1] = true;
                    else
                        flag[k][k+j+1] = false;
                }
            }
            vector<int> result(length+1);
            result[0] = -1;
            for(int i = 1;i <= length;i++){
                result[i] = i-1;
                for(int j = i-1;j >= 0;j--){
                    if(flag[j+1][i] == true){
                        if(result[j] + 1 < result[i])
                            result[i] = result[j] + 1;
                    }
                }
            }
            return result[length];
        }
    };
  • 相关阅读:
    Spring--之旅
    体验 Windows 系统 CVM
    基于 CentOS 搭建 WordPress 个人博客
    Codeforces Round #316 (Div. 2)
    BZOJ 1048 [HAOI2007]分割矩阵
    BZOJ 1047 [HAOI2007]理想的正方形
    BZOJ 1045 [HAOI2008] 糖果传递
    BZOJ 1042 [HAOI2008]硬币购物
    BZOJ 1030 [JSOI2007]文本生成器
    BZOJ 第二波刷题开始喽
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10701400.html
Copyright © 2011-2022 走看看