131.分割回文串
题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: “aab”
输出:
[
[“aa”,“b”],
[“a”,“a”,“b”]
]
class Solution {
public:
vector<vector<string>> partition(string s) {
//存放答案
vector<vector<string>> ans;
//存放当前结果
vector<string> cur;
dfs(s, 0, ans, cur);
return ans;
}
void dfs(const string& s, int startIndex, vector<vector<string>>& ans, vector<string>& cur)
{
//起始位置大于等于字符串长度时,说明找到了答案
if(startIndex >= s.size())
{
ans.push_back(cur);
return;
}
for(int i = startIndex; i< s.size(); i++)
{
//判断是否是回文串
if(isPalindrome(s, startIndex, i))
{
//是的话,截取字符串存入cur
string str = s.substr(startIndex, i-startIndex+1);
cur.push_back(str);
}
//否则,则跳过
else
{
continue;
}
//回溯寻找下一个位置
dfs(s, i+1, ans, cur);
//删除存入的字符串,以便进行下一次回溯
cur.pop_back();
}
}
//判断是否是回文串
bool isPalindrome(const string& s, int start, int end)
{
for(int i = start, j =end; i<j;i++,j--)
{
if(s[i] != s[j])
return false;
}
return true;
}
};