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

Return all possible palindrome partitioning of s.

Example:

Input: “aab”
Output:
[
[“aa”,”b”],
[“a”,”a”,”b”]
]

题目链接

可以回溯法切割出来字串,然后判断是否为回文串

由于要找出来全部的字串,所有回溯的范围应该是全部遍历一遍。使用for循环进行横向的遍历,for循环结束的条件就是本层集合的个数(也就是树中孩子的数量),cur代表当前要切割的位置

for(int i=cur;i<s.length();i++)

然后进行纵向的遍历,每当切割出来一个回文串,就把其放入tmp中,然后进行回溯。否则跳过。

if(Ispalindrome(s,cur,i)){
string item=s.substr(cur,i-cur+1);
tmp.push_back(item);
dfs(s,i+1);
tmp.pop_back();
}else{
continue;
}

回溯结束的条件就是当切割点cur的大小已经大于或者等于s的大小

if(cur>=s.length())

判断回文串较为简单,用两个指针分别指向字符串的头和尾,如果两个指针所指向的字母一直相等到中间,就是回文串。

bool Ispalindrome(string s,int start,int end){
for(int i=start,j=end;i<j;i++,j--){
if(s[i]!=s[j]){
return false;
}
}
return true;
}

全部代码如下:

class Solution {
public:
vector<vector<string>> res;
vector<string> tmp;

void dfs(const string &s,int cur){
if(cur>=s.length()){
res.push_back(tmp);
return;
}
for(int i=cur;i<s.length();i++){
if(Ispalindrome(s,cur,i)){
string item=s.substr(cur,i-cur+1);
tmp.push_back(item);
dfs(s,i+1);
tmp.pop_back();
}else{
continue;
}

}


}
bool Ispalindrome(string s,int start,int end){
for(int i=start,j=end;i<j;i++,j--){
if(s[i]!=s[j]){
return false;
}
}
return true;
}
vector<vector<string>> partition(string s) {
tmp.clear();
res.clear();
dfs(s,0);
return res;
}
};