题意:
给定一个字符串,要求将字符串分割成为回文子串,问有多少种分割方案?返回所有的情况。
思路:
要将字符串分割成回文子串,首先想到的是回溯,遍历字符串,然后判断该子串是否是回文子串,如果是的话,那么进入下一层继续分割。这里重点是如何判断该子串是否是回文子串,可以用一个二维数组来记忆化。如果是回文子串,那么返回1。
class Solution {
public:
vector<string> temp;
//记忆化搜索过的子串
vector<vector<int>> dp;
vector<vector<string>> res;
int n;
void dfs(string s, int index){
if(index == n){
res.push_back(temp);
return;
}
for(int i = index; i < n; i++){
if(check(s, index, i) == 1){
temp.push_back(s.substr(index, i - index + 1));
dfs(s, i + 1);
temp.pop_back();
}
}
}
int check(string s, int i, int j){
if(dp[i][j]) return dp[i][j];
if(i >= j){
dp[i][j] = 1;
return dp[i][j];
}
if(s[i] == s[j] )
dp[i][j] = check(s, i+1, j-1);
else
dp[i][j] = -1;
return dp[i][j];
}
vector<vector<string>> partition(string s) {
n = s.size();
dp.resize(n, vector<int>(n));
dfs(s, 0);
return res;
}
};
时间复杂度:回溯的过程相当于遍历一棵n叉树,本题判断子串是否为回文只有是和不是两种情况,因此是一个二叉树,最坏情况下有n个回文子串,层数是串的长度n,因此是O(2^n)。每一种方案需要遍历子串求出结果,也就是O(n),因此总的时间复杂度就是O(n*2^n)。
空间复杂度:O(n^2)