题目链接:https://leetcode-cn.com/problems/palindrome-partitioning/
题目:
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]
解题报告:
先dp预处理出所有所有回文串,然后dfs就行了。如果没要求输出所有方案数,则依旧可以O(n^2) dp出方案数。
AC代码:
class Solution {
public:vector<vector<string>> ans;vector<string> tmp;int length;int dp[1005][1005];void dfs(int pos, string s) {if(pos == length+1) {ans.push_back(tmp);return ;}for(int i = pos; i<=length; i++) {if(dp[pos][i]) {tmp.push_back(s.substr(pos-1,i-pos+1));dfs(i+1,s);tmp.pop_back();}}}vector<vector<string>> partition(string s) {length = s.length();for(int l = 1; l<=length; l++) dp[l][l] = 1;for(int l = 1; l<length; l++) {if(s[l-1] == s[l]) dp[l][l+1] = 1;}for(int len = 3; len <= length; len++) {for(int l = 1; l+len-1<=length; l++) {int r = l+len-1;dp[l][r] = dp[l+1][r-1] && (s[l-1] == s[r-1]);}}dfs(1,s);return ans;}
};