5.分割回文串Ⅰ-中等-动态规划回溯
题目描述
给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。
示例一:
输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]
示例二:
输入:s = "a"
输出:[["a"]]
思路
使用一个数组保存区间[i, j]内的子串回文状况,动态规划转移条件:
f[i][j] = true;
f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1] (i = j + 1, 可写成与下面一样的形式,i+1 > j-1 有f[i+1][j-1] = true)
f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1] (i >= j + 2)
回溯:
枚举每个子串的回文情况,将所有回文子串组合加入到结果中,终止条件是枚举位置等于字符串长度。
代码
class Solution{
private:
vector<string> path;
vector<vector<string>> ans;
vector<vector<bool>> f;
int n;
public:
void dfs(string& s, int i){
if(i == n){
ans.push_back(path);
return;
}
for(int j = i; j < n; j++){
if(f[i][j]){
path.push_back(s.substr(i, j - i + 1));
dfs(s, j + 1);
path.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
int n = s.size();
f.resize(n, vector<bool>(n, true));
for(int i = n - 2; i >= 0; i--){
for(int j = i + 1; j < n; j++){
f[i][j] = (s[i] == s[j]) && f[i+1][j-1];
}
}
dfs(s, 0);
return ans;
}
};

浙公网安备 33010602011771号