131. 分割回文串
问题
给你一个字符串 s,请你将 s 分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
示例 1:
输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a"
输出:[["a"]]
分析
子问题是处理string s[x...n-1],显然,有多种切割方法,所以dfs中进行for循环枚举切割点,判断切割得到的左边串是否回文,如果回文,传递右边串继续dfs;如果不回文,continue该切割点。每次dfs时,传递还未处理的字符串,或者传递新串开始的索引即可。
代码
class Solution {
public:
string s;
int s_n;
vector<vector<string> > res;
int f[19][19];
void dfs(vector<string> v_temp,int x) { // x是起点
if (x == s_n) {
res.push_back(v_temp);
return ;
}
for (int i = x; i < s_n; i++) {
if (!f[x][i]) {continue;}
v_temp.push_back(s.substr(x, i-x+1));
dfs(v_temp, i+1); // 注意这里是+1
v_temp.pop_back();
}
}
vector<vector<string>> partition(string s) {
this->s = s;
s_n = s.size();
memset(f, 1, sizeof f);
for (int i = s_n-1; i >= 0; i--) {
for (int j = i+1; j < s_n; j++) {
// f[a][b]当a > b时都设置为true,可避免复杂的判断
f[i][j] = f[i+1][j-1] && (s[i] == s[j]);
}
}
vector<string> v_temp;
dfs(v_temp, 0);
return res;
}
};

浙公网安备 33010602011771号