分割回文串
分割回文串给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> result;
vector<string> middle;
//partitionHuiString(result,s,0,s.size()-1);
partition2(s,0,middle,result);
//if(isHui("aa",0,1)) cout<<"aa是回文"<<endl;
return result;
}
/*void partition2(string s,int start,int end,vector<vector<string>> &result)
{
vector<string> middle;
for(int end=start; end<=s.size();end++){
string str = s.substr(start,end-start);
string str2 = s.substr(0,start-0+1);
string str3 = s.substr(end,s.size()-end+1);
//cout<<str<<" ";
middle.push_back(str2);
middle.push_back(str);
middle.push_back(str3);
}
}*/
//没错,起点也在从0开始增加。终点可以不传入,因为对于每个起点来说,终点都是变化的,都是当前这个起点往后推到最后是终点。因为怕重复,所以要从每个partition里面他们再自己调用后面的?当然可以,但也可以不用吧。
void partition2(string s,int start,vector<string> &middle, vector<vector<string>> &result)
{
if(start==s.size())
{
result.push_back(middle);
return ;
}
for(int end=start; end<s.size();end++){
string str = s.substr(start,end-start+1);
//if(isHui(s,start,end))
//{
if(isHui(s,start,end))
{
cout<<str<<endl;
middle.push_back(str);
partition2(s,end+1,middle,result);
middle.pop_back();
}
// }
//cout<<str<<" ";
}
}
void partitionHuiString(vector<vector<string>> &result,string s,int start,int end)
{
if(start<end)
{
vector<string> middle;
int mid = (start + end)/2;
partitionHuiString(result,s,start,mid);
partitionHuiString(result,s,mid+1,end);
if(isHui(s,start,mid)) middle.push_back(s.substr(start,mid-start+1));
if(isHui(s,mid+1,end)) middle.push_back(s.substr(mid+1,end-mid));
result.push_back(middle);
//middle.push_back("1");
result.push_back(middle);
}
if(start==end)
{
vector<string> middle;
middle.push_back(s.substr(start,1));
result.push_back(middle);
}
return;
}
// string getsubstrbyIndex(string s,int startIndex,int endIndex)
// {
// string substr;
// for(int i=startIndex;i<=endIndex;i++)
// {
// substr += s[i];
// }
// return s;
//}
bool isHui(string s,int startIndex,int endIndex)
{
//if(startIndex<endIndex)
//{
for(int i=startIndex,j=endIndex;i<=j;i++,j--)
{
if(s[i]!=s[j])
return false;
}
//}
return true;
}
};