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”]
]
分析:
先不考虑所有的情况,针对一个符合条件的划分,每一部分都是一个回文子串,而且各部分的长度不固定。也即每一部分都是原始字符串的一个子串,且满足回文条件。所有的划分都满足上述条件,所以这就启发我们首先判断原始字符串的任意子串是否为回文子串。判断一个字符串是否为回文串最简单的方法是对字符串进行遍历。得到回文子串的结果之后我们该如何利用去获得所有可能的划分呢?此时,该问题就变为一个典型的深度优先遍历问题,问题的解空间就是所有可能划分的划分树,我们只需要遍历所有的分支直到叶节点,即为一个可能的划分。
vector<vector<string>> partition(string s) {
vector<vector<string>> ans;
if(s.empty())
return ans;
vector<string> vec;
DFS(s, vec, ans);
return ans;
}
void DFS(string s, vector<string> vec, vector<vector<string>>& ans) {
if (s.size() < 1) { //递归终止条件
ans.push_back(vec);
return;
}
for (int i = 0; i < s.size(); i++) {
int start = 0;
int end = i;
while(start < end){
if (s[start] == s[end]) {
start++;
end--;
}
else
break;
}
if (end <= start) { //当前字符串s中0-i是回文子串
vec.push_back(s.substr(0, i + 1));
string ss = s.substr(i + 1); //更新下一次递归时的字符串
DFS(ss, vec, ans);
vec.pop_back();
}
}
return;
}