给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]
思路:
dp[i][j]
用来存储s
从i
到j
的字符串是否为回文字符串;
回溯算法
代码
class Solution {
vector<vector<int> >dp;
vector<string> path;
vector<vector<string> >result;
int n;
void backtracking(string& s,int temp){ //回溯
if(temp==n){
result.push_back(path);
return;
}
for(int j=temp;j<n;j++){
if(dp[temp][j]){
path.push_back(s.substr(temp,j-temp+1));
backtracking(s,j+1);
path.pop_back();
}
}
}
public:
vector<vector<string>> partition(string s) {
n=s.size();
dp.assign(n,vector<int>(n,true));
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]; //判断从i到j是否为回文字符串
}
}
backtracking(s,0);
return result;
}
};