题目:
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: “aab”
输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]
分析:
有点向之前求所有子串问题,采用DP动态规划算法,只是多加上了判断是否为回文串, 在"aab" 一例中可以依次分析如下分割是否满足回文串特性:
a-a-b
a-ab
aa-b
aab
这些分割组合是通过回溯算法形成的
void getPartition(string s, vector<string> temp, vector<vector<string>>& result) {
if(s.length() == 0){
result.push_back(temp);
}
else {
for(int i = 1; i <= s.length(); i++) {
string subs = s.substr(0, i);
if(isPalindrome(subs)) {
temp.push_back(subs);
getPartition(s.substr(i,s.length()), temp, result);
temp.pop_back();
}
}
}
}
每次从本次待分割子串的0/头位置开始依次查看长度(不超过子串长度)为1,2,3…的子串是否可以满足回文串要求,若满足,则继续分割剩下的子串,直到子串长度为0分割完毕放入result中( result.push_back(temp)),并依次回溯(temp.pop_back()),查看更长长度的子串是否满足回文串要求。
总体代码:
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<string> temp;
vector<vector<string>> result;
getPartition( s, temp, result);
return result;
}
void getPartition(string s, vector<string> temp, vector<vector<string>>& result) {
if(s.length() == 0){
result.push_back(temp);
}
else {
for(int i = 1; i <= s.length(); i++) {
string subs = s.substr(0, i);
if(isPalindrome(subs)) {
temp.push_back(subs);
getPartition(s.substr(i,s.length()), temp, result);
temp.pop_back();
}
}
}
}
bool isPalindrome(string s) {
transform(s.begin(),s.end(),s.begin(),::tolower);
int i=0, j=s.length()-1;
while(i < j) {
if(s[i++] != s[j--]){
return false;
}
}
return true;
}
};
22 / 22 个通过测试用例
状态:通过
执行用时:168 ms