【LeetCode-131】分割回文串
问题
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例
输入: s = "aab"
输出: [["a","a","b"],["aa","b"]]
解答
class Solution {
public:
vector<vector<string>> partition(string s) {
int n = s.size();
dp.assign(n, vector<bool>(n, 1));
for (int i = n - 1; i >= 0; i--)
for (int j = i + 1; j < n; j++)
dp[i][j] = (s[i] == s[j]) && dp[i + 1][j - 1];
backTrace(s, 0);
return res;
}
private:
vector<vector<string>> res;
vector<vector<bool>> dp;
vector<string> ans;
void backTrace(string& s, int pos) {
if (pos == s.size()) res.push_back(ans);
for (int i = pos; i < s.size(); i++) {
if (!dp[pos][i]) continue;
ans.push_back(s.substr(pos, i - pos + 1));
backTrace(s, i + 1);
ans.pop_back();
}
}
};
重点思路
使用动态规划得到所有情况下是否为回文串,再使用回溯得到所有可能的结果。