leetCode 131 Palindrome Partitioning 分割回文串

##### Palindrome Partitioning

分割回文串

题目

image-20201221205325806

题意

给你一个字符串,将该字符串划分为若干个子字符串,若这些子字符串都为回文串,则输出这一组子字符串

分析

因为要进行划分,切要输出具体子字符串,故dp不适合该题

考虑到字符串的最大长度为16,对其子字符串组的划分共有\(C_{15}^{1}+C_{15}^2+....+C_{15}^{15}\) 相当于往字符串的15个空中插入若干个分割符, 根据**二项式定理 **共有\(2^{15}-1\) 种划分

这个数量是在可接受范围内的,因此我们可以通过暴力枚举的方式进行解决

我们采取dfs搜索的方法,每次搜索时都会把剩余的序列进行划分,判断序列是否为回文

具体代码如下

class Solution {
public:
    
    vector<vector<string>> ans;
    
    bool test(string &s,int Start,int End){
       
        int n=(End-Start);
        for(int i=0;i<n/2;i++){
            if(s[Start+i]!=s[Start+n-i-1]){
                return false;
            }
        }
        return true;
    }
    
    void dfs(string& s,int k,vector<string> & tmp){
        if(k==s.size()){
            ans.push_back(tmp);
            return ;
        }
        for(int i=k+1;i<=s.size();i++){
            if(test(s,k,i)){ //子数组为回文
                tmp.push_back(s.substr(k,i-k));
                //cout<<s.substr(k,i-k)<<endl;
                dfs(s,i,tmp);
                if(!tmp.empty())
                tmp.pop_back();
            }
        }
        return ;
            
    }
    
    vector<vector<string>> partition(string s) { 
        vector<string> tmp;
        dfs(s,0,tmp);
        return ans;        
    }
};
posted @ 2020-12-21 21:32  bean_boom  阅读(70)  评论(0编辑  收藏  举报