给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]
思路分析:运用递归回溯的思想,这道理毫无疑问是每一种可能性都要判断,没有什么投机取巧的方法。所以我们采用递归的思想,关键是找到递归的思路。我们让函数从字符串第index开始分割一个子串,长度为i,再从第index+i处开始分割。所以递归的终止条件是index==子串的长度,这个时候已经不能再分割了。判断的时候 要判断分割出的子串是否是回文字符串,这个比较简单,如果是的话就把它存到结果里,继续分割,如果不是那么就继续寻找。要注意的是,将子串放进结果里,后面的字符串找完之后还要pop_back()出来。
C++代码如下:
class Solution {
vector<vector<string>> res;
//判断是否是回文字符串
bool isP(string a)
{
int len=a.size();
int l= 0 ;
int r= a.size()-1;
while(l<r)
{
if(a[l] != a[r])
{
return false;
}
l++;r--;
}
return true;
}
//从string[index]开始分割 out是分割结果
void part(string s, int index, vector<string>& out)
{
// cout<<s<<" "<<index<<" "<<out<<endl;
if(index == s.size())
{//没有能分割的了
res.push_back(out);
return;
}
for(int i=index; i < s.size(); i++)
{
string subs = s.substr(index,i-index+1);
if(isP(subs))
{//是回文的话
out.push_back(subs);
part(s,i+1,out);
out.pop_back();
}
}
}
public:
vector<vector<string>> partition(string s) {
res.clear();
if(s.size() == 0) return res;
vector<string> out;
part(s,0,out);
return res;
}
};