题目:
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是
回文串
。返回 s
所有可能的分割方案。
示例 1:
输入:s = "aab" 输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a" 输出:[["a"]]
难点:这里用到一个很取段的思路,其实和取点的内容差不多,但是取端更难理解。
思路:直接看回溯函数的内容,首先我们是取段的,如果这一段不行那就往后面加1,直到加道循环结束。然后就被pop掉。如果可以取端,并且取到了最后一段,也就是开始的startIndex大于等于size那么就代表这一条都是回文字符串。然后需要一个判断函数,判断字符串是否为回文字符串,如果是往path里面加。
学到的新函数:array.substr( a ,b) a表示字符串的开始,b表示数量 含义:选取字符串array从a开始往后的b个数
看代码:
class Solution {
private:
vector<vector<string>> result;
vector<string> path;
void backtraking(string s,int startIndex)
{
if(startIndex > s.size()-1)
{
result.push_back(path);
return;
}
for(int i = startIndex;i < s.size();i++)
{
if(check(s,startIndex,i))
{
string str = s.substr(startIndex,i-startIndex+1);
path.push_back(str);
}
else {continue;}
backtraking(s,i+1);
path.pop_back();
}
}
bool check(string s,int a,int b)
{
int left = a;
int right = b;
for(; left < right; left++,right--)
{
if(s[left] != s[right])return false;
}
return true;
}
public:
vector<vector<string>> partition(string s)
{
backtraking(s,0);
return result;
}
};