85)生成匹配的括号
纯纯的dfs
class Solution{
public:
vector<string> res;
vector<string> generateParenthesis(int n){
dfs(n, 0, 0, "");
return res;
}
void dfs(int n, int left, int right, string str){
if(left==n && right==n) res.push_back(str);
else{
if(left<n) dfs(n, left+1, right, str+'(');
if(right<n && left>right) dfs(n, left, right+1, str+')');
}
}
};
回溯法
class Solution{
public:
vector<string> res;
string path;
vector<string> generateParenthesis(int n){
if(n==0) return {};
backtrack(n, n);
return res;
}
void backtrack(int left, int right){
if(left>right) return;
if(left<0 || right<0) return;
if(left==0 && right==0){
res.push_back(path);
return;
}
path.push_back('(');
backtrack(left-1, right);
path.pop_back();
path.push_back(')');
backtrack(left, right-1);
path.pop_back();
}
};
86)分割回文子字符串
class Solution{
private:
vector<vector<string>> res;
vector<string> path;
public:
vector<vector<string>> partition(string s){
backtrack(s, 0);
return res;
}
void backtrack(string& s, int start){
if(start==s.size()){
res.push_back(path);
return;
}
for(int i=start; i<s.size(); i++){
if(isPalindrom(s, start, i)){
string str = s.substr(start, i-start+1);
path.push_back(str);
backtrack(s, i+1);
path.pop_back();
}
}
}
bool isPalindrom(string s, int left, int right){
while(left < right){
if(s[left++] != s[right--]) return false;
}
return true;
}
};
87)复原IP
class Solution{
private:
vector<string> res;
public:
vector<string> restoreIpAddresses(string s){
string path;
backtrack(s, 0, path);
return res;
}
void backtrack(string s, int start, string path){
if(start==4){
if(s.empty()) res.push_back(path);
} else{
for(int i=1; i<4; i++){
if(s.size() < i) break;
int val = stoi(s.substr(0, i));
if(val>255 || to_string(val).size() != i) continue;
backtrack(s.substr(i), start+1, path+s.substr(0, i)+(start==3 ? "" : ".")); }
}
}
};