【LeetCode-回溯】分割回文串
题目描述
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]
题目链接: https://leetcode-cn.com/problems/palindrome-partitioning/
思路
由于是求所有可能分割情况,所以使用回溯来做。代码如下:
class Solution {
public:
vector<vector<string>> partition(string s) {
if(s.empty()) return {};
vector<vector<string>> ans;
vector<string> cur;
int start = 0;
dfs(s, start, cur, ans);
return ans;
}
void dfs(string s, int start, vector<string> cur, vector<vector<string>>& ans){
if(start>=s.size()){
ans.push_back(cur);
return;
}
for(int i=start; i<s.size(); i++){
string sub = s.substr(start, i-start+1);
if(judge(sub)){
cur.push_back(sub);
dfs(s, i+1, cur, ans);
cur.pop_back();
}
}
}
/*判断s是否是回文串,是返回true,不是返回false*/
bool judge(string s){
if(s.size()==1) return true;
int left = 0;
int right = s.size()-1;
while(left<right){
if(s[left]!=s[right]) return false;
left++;
right--;
}
return true;
}
};
使用下面的写法(多加了几个引用&
)可以将速度提升 4 倍:
class Solution {
public:
vector<vector<string>> partition(string s) {
if(s.empty()) return {};
vector<string> cur;
vector<vector<string>> ans;
int start = 0;
dfs(s, start, cur, ans);
return ans;
}
void dfs(string& s, int start, vector<string>& cur, vector<vector<string>>& ans){
if(start>=s.size()){
ans.push_back(cur);
return;
}
for(int i=start; i<s.size(); i++){
string sub = s.substr(start, i-start+1);
if(judge(sub)){
cur.push_back(sub);
dfs(s, i+1, cur, ans);
cur.pop_back();
}
}
}
/*判断s是否是回文串,是返回true,不是返回false*/
bool judge(string& s){
if(s.size()==1) return true;
int left = 0;
int right = s.size()-1;
while(left<right){
if(s[left]!=s[right]) return false;
left++;
right--;
}
return true;
}
};