leetCode 131 Palindrome Partitioning 分割回文串
##### Palindrome Partitioning
分割回文串
题目
题意
给你一个字符串,将该字符串划分为若干个子字符串,若这些子字符串都为回文串,则输出这一组子字符串
分析
因为要进行划分,切要输出具体子字符串,故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;
}
};