第一题 复原ip
查了半天的错才发现问题:
1.因为向量是一个字符串所以不需要用vector<vector<string>> 只要一层vector<string>就行了,搞了半天真的气,
2.因为输入的是字符串所以是‘0’ 不是0,导致判断的时候一直识别不了。
class Solution {
public:
vector<string> result;
int count = 0;
bool isvalid(string &s,int left,int right){
if(left > right) return false;
int num = 0;
if(left != right && s[left] == '0') {
return false;
}
for(int i = left;i <= right;i++){
if(s[i]>'9' || s[i] <'0') {
return false;
}
num = num * 10+(s[i] -'0');
if(num > 255) {
return false;
}
}
return true;
};
void backtrack(string &s,int index){
if(count == 3 && isvalid(s,index,s.size()-1)){
result.push_back(s);
return;
}
for(int i = index;i<s.size();i++){
if(isvalid(s,index,i)){
s.insert(s.begin()+i+1,'.');
count++;
backtrack(s,i+2);
s.erase(s.begin()+i+1);
count--;
}
else break;
}
return;
};
vector<string> restoreIpAddresses(string s) {
backtrack(s,0);
return result;
}
};
第二题 子集
书写出来一个小问题,外面用了nums 里面用了s ,还有就是index前面int忘记写了。
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtrack(vector<int> &nums,int index){
result.push_back(path);
if(index == nums.size()) return;
for(int i = index;i < nums.size();i++){
path.push_back(nums[i]);
backtrack(nums,i+1);
path.pop_back();
}
return;
}
vector<vector<int>> subsets(vector<int>& nums) {
backtrack(nums,0);
return result;
}
};
第三题 子集二
加一个used数组就行了。
class Solution {
public:
vector<vector<int>> result;
vector<vector<int>> res;
vector<int> path;
void backtrack(vector<int> &s, int index,vector<int> &used){
if(index == 0) result.push_back(path);
if(index == s.size()){
return;
}
for(int i = index;i < s.size();i++){
if(i > 0 && s[i] == s[i-1] && used[i-1] == 0) continue;;
path.push_back(s[i]);
result.push_back(path);
used[i] = 1;
backtrack(s,i+1,used);
path.pop_back();
used[i] = 0;
}
return;
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<int> used(nums.size(),0);
backtrack(nums,0,used);
return result;
}
};
控制台