93. 复原 IP 地址
class Solution {
private:
vector<string> ret_;
public:
bool isVaildIpAddress(const string &s, int start, int end) {
if (end - start > 2) return false;
if (start > end) return false;
// 后面的条件可以排除 0000
if (s[start] == '0' && start != end) return false;
int num = 0;
for (int i = start; i <= end; i++) {
if (s[i] > '9' || s[i] < '0') return false;
num = num * 10 + (s[i] - '0');
if (num > 255) return false;
}
return true;
}
void backTracking(string &s, int startIndex, int pointNum) {
if (pointNum == 3) {
if (isVaildIpAddress(s, startIndex, s.size() - 1)) {
ret_.push_back(s);
}
return;
}
for (int i = startIndex; i < s.size(); i++) {
if (isVaildIpAddress(s, startIndex, i)) {
s.insert(s.begin() + i + 1, '.');
pointNum++;
backTracking(s, i + 2, pointNum);
pointNum--;
s.erase(s.begin() + i + 1);
} else {
break;
}
}
}
vector<string> restoreIpAddresses(string s) {
backTracking(s, 0, 0);
return ret_;
}
};
78. 子集
class Solution {
// 遍历整个树的所有节点
private:
vector<vector<int>> ret_;
vector<int> path_;
public:
void backTracking(vector<int>& nums, int startIndex) {
ret_.push_back(path_);
if (startIndex >= nums.size()) return;
for (int i = startIndex; i < nums.size(); i++) {
path_.push_back(nums[i]);
backTracking(nums, i + 1);
path_.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
backTracking(nums, 0);
return ret_;
}
};
90. 子集 II
class Solution {
private:
vector<vector<int>> ret_;
vector<int> path_;
vector<bool> used_;
public:
void backTracking(vector<int>& nums, int startIndex) {
ret_.push_back(path_);
for (int i = startIndex; i < nums.size(); i++) {
if (i > 0 && nums[i] == nums[i-1] && used_[i-1] == false) {
continue;
}
path_.push_back(nums[i]);
used_[i] = true;
backTracking(nums, i + 1);
used_[i] = false;
path_.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
used_.resize(nums.size(), false);
sort(nums.begin(), nums.end());
backTracking(nums, 0);
return ret_;
}
};