题目描述
给你一个字符串 s,请你将 s 分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
示例 1:
输入 :s = "aab"
输出 :[["a","a","b"],["aa","b"]]
示例 2:
输入 :s = "a"
输出 :[["a"]]
提示:
1 <= s.length <= 16
s 仅由小写英文字母组成
思路
进行dfs遍历,每层从l到r是否合理。
代码
cpp
class Solution {
public:
vector<vector<string>> partition(string s) {
// 记录多个答案
vector<vector<string>>ans;
// 记录单个答案
vector<string>res;
// dfs遍历每种情况
dfs(s, 0, s.length(), res, ans);
return ans;
}
void dfs(string &s, int first, int n, vector<string> &res, vector<vector<string>> &ans)
{
if(first == n)
{
ans.push_back(res);
return;
}
for(int i = first; i < n; ++i)
{
// 判断[l-r]是否是回文串
int l = first, r = i;
while(l < r && s[l] == s[r]) ++l, --r;
if(l > r || s[l] == s[r])
{
res.push_back(s.substr(first, i - first + 1));
dfs(s, i + 1, n, res, ans);
res.pop_back();
}
}
}
};