• LeetCode: Palindrome Partitioning [131]


    【称号】

    Given a string s, partition s such that every substring of the partition is a palindrome.

    Return all possible palindrome partitioning of s.

    For example, given s = "aab",
    Return

      [
        ["aa","b"],
        ["a","a","b"]
      ]

    【题意】

        给定一个字符串s, 要求对s进行划分,划分后每一个子串都是回文串。


        要求返回全部的划分情况


    【思路】

        直观思路是使用逐层递归。先确定第一个点。然后确定第二个点,再确定第三个点,依次类推。这样的方式的时间复杂度很高。
        
        本题使用DP:先计算出随意两个位置i,j之间的子串是否是回文串,用IsPalindrome[i][j]表示。

        


    【代码】

    class Solution {
    public:
        
        void getPartition(vector<vector<string> >&result, vector<string>&splits, int start, string&s, vector<vector<bool> >&isPal){
            //spits-已切分的结果,start-当前切分開始的位置
            if(start==s.length()){
                vector<string> newSplits = splits;
                result.push_back(newSplits);
                return;
            }
            
            for(int end=start; end<s.length(); end++){
                if(isPal[start][end]){
                    splits.push_back(s.substr(start, end-start+1));
                    getPartition(result, splits, end+1, s, isPal);
                    splits.pop_back();
                }
            }
        }
        
        vector<vector<string>> partition(string s) {
            vector<vector<string> >result;
            int len=s.length();
            if(len==0)return result;
            
            vector<vector<bool> > isPal(len, vector<bool>(len, false));
            //初始化isPal[i][i]=true;
            for(int i=0; i<len; i++)
                isPal[i][i]=true;
            //初始化相邻两位字符构成的子串
            for(int i=0; i<len-1; i++)
                if(s[i]==s[i+1])isPal[i][i+1]=true;
            //推断其它i<j的位置
            for(int i=len-3; i>=0; i--)
                for(int j=i+2; j<len; j++)
                    isPal[i][j]=(s[i]==s[j]) && isPal[i+1][j-1];
            
            //确定全部的组合
            vector<string> splits;
            getPartition(result, splits, 0, s, isPal);
            return result;
        }
    };


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    CentOS FTP基于虚拟用户的配置
    CentOS6.5 FTP配置
    MAC 隐藏文件的显示
    nignx知识点总结
    什么是函数式编程
    javascript有用代码片段
    PHP百杂
    好文:javascript中的四种循环
    好文:node.js最佳实践
    好文:不使用匿名函数的三个理由
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4827072.html
Copyright © 2020-2023  润新知