LeetCode 93 复原IP地址
这题比较麻烦,我自己写得也不够简洁。回头看看比较好的题解再优化下思路。目前代码如下,达不到面试要求,修修改改才过。把所有点才给踩全。
class Solution {
private:
string path;
vector<string> res;
vector<int> pos{-1,-1,-1};
void backtracking(string s, int index) {
if (index == s.length()) {
string s1 = s.substr(0, pos[0] + 1);
string s2 = s.substr(pos[0] + 1, pos[1] -pos[0]);
string s3 = s.substr(pos[1] + 1, pos[2] - pos[1]);
string s4 = s.substr(pos[2] + 1, s.length() - pos[2] - 1);
if (s1 == "" || s2 == "" || s3 == "" || s4 == "")
return;
if (s1.length() > 3 || s2.length() > 3 || s3.length() > 3 || s4.length() > 3)
return;
if (s1[0] == '0' && s1.length() > 1) return;
if (s2[0] == '0' && s2.length() > 1) return;
if (s3[0] == '0' && s3.length() > 1) return;
if (s4[0] == '0' && s4.length() > 1) return;
int n1 = stoi(s1);
int n2 = stoi(s2);
int n3 = stoi(s3);
int n4 = stoi(s4);
cout << n1 << ' ' << n2 << ' ' << n3 << ' ' << n4 << endl;
if (n1 >= 0 && n1 <= 255 && n2 >= 0 && n2 <= 255 &&
n3 >= 0 && n3 <= 255 && n4 >= 0 && n4 <= 255) {
res.push_back(path);
}
return;
}
for (int i = index; i < s.length(); i++) {
path += s[i];
if (pos[0] == -1) {
string t = path;
pos[0] = i;
path += ".";
backtracking(s, i + 1);
pos[0] = -1;
path = t;
} else if (pos[1] == -1) {
string t = path;
pos[1] = i;
path += ".";
backtracking(s, i + 1);
pos[1] = -1;
path = t;
} else if (pos[2] == -1) {
string t = path;
pos[2] = i;
path += ".";
backtracking(s, i + 1);
pos[2] = -1;
path = t;
} else {
path = path + s.substr(i+1, s.length() - i);
backtracking(s, s.length());
i = s.length() - 1;
}
}
}
public:
vector<string> restoreIpAddresses(string s) {
if (s.length() <= 3 || s.length() >= 16) return res;
backtracking(s, 0);
return res;
}
};
LeetCode 78 子集di
这题就比较轻松了。昨晚笔试第二题要考这么容易我也不至于靠出个历史最低分了哎。
代码如下:
class Solution {
private:
vector<int> path;
vector<vector<int>> res;
void backtracking(vector<int>& nums, int size, int index) {
if (path.size() == size) {
res.push_back(path);
return;
}
if (index == nums.size()) return;
for (int i = index; i < nums.size(); i++) {
path.push_back(nums[i]);
backtracking(nums, size, i + 1);
path.pop_back();
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
for (int i = 0; i <= nums.size(); i++)
backtracking(nums, i, 0);
return res;
}
};
LeetCode 90子集II
这题就是上一题去重。哎昨晚是真的难受。第三题像CCF第三题一样。我都没时间看。怎么这么菜的呀
class Solution {
private:
vector<int> path;
vector<vector<int>> res;
void backtracking(vector<int>& nums, int size, int index) {
if (path.size() == size) {
res.push_back(path);
return;
}
if (index == nums.size()) return;
for (int i = index; i < nums.size(); i++) {
path.push_back(nums[i]);
backtracking(nums, size, i + 1);
while (i + 1 < nums.size() && nums[i + 1] == nums[i]) i++;
path.pop_back();
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
for (int i = 0; i <= nums.size(); i++)
backtracking(nums, i, 0);
return res;
}
};