代码随想录算法训练营第二十三天| 93.复原IP地址 78.子集 90.子集II
// 切割 有多次迭代,把每次结果都放进vector里面,然后在对vector pop 是因为 aa b a; a aba a, 这是两种情形,但是我这里把a a 看成了一种,因此出现了问题
// 所以分割仅对于 当前每种不同分割的情况,并不适用于,这种累加。
93.复原IP地址
思路:
先考虑合法的情况,然后再依次往path里面加字符,如果它的长度>4但是还没有到最末尾,也就是说他是错的,也就return出去
代码:
1 //根据给定的一组字符串,分出来可能正确的IP 2 //思路:切割,[start, i],其中长度为0-3, 3 //判断是否满足条件:0后面不可以有任何数字 4 //终止条件:如果startIndex == 最后 并且path的长度为4,那么 就把所有的vector<string>path,合并在一起,组成string,放进result中 5 bool isLegalIp(string s) 6 { 7 //最大值为255 8 if (*s.begin() == '0' && s.size() > 1) 9 { 10 return false; 11 } 12 if (stoi(s) > 255) 13 { 14 return false; 15 } 16 17 return true; 18 } 19 20 void restoreIpAddresses_trackBack(string s, int startIndex, vector<string>& path, vector<string>& result) 21 { 22 if (path.size() == 4 && startIndex == s.size()) 23 { 24 string re_; 25 for (string val_ : path) 26 { 27 re_ += val_ + '.'; 28 } 29 re_.pop_back(); 30 result.push_back(re_); 31 return; 32 } 33 else if (path.size() == 4 && startIndex != s.size()) 34 { 35 return; 36 } 37 38 for (int i = startIndex; i < s.size()&&(i-startIndex)<=2; i++) 39 { 40 string cur_(s.begin() + startIndex, s.begin() + i + 1); 41 if (isLegalIp(cur_)) 42 { 43 path.push_back(cur_); 44 restoreIpAddresses_trackBack(s, i + 1, path, result); 45 path.pop_back(); 46 } 47 } 48 } 49 vector<string> restoreIpAddresses(string s) { 50 vector<string>result; 51 if (s.size() == 0) return result; 52 vector<string>path; 53 restoreIpAddresses_trackBack(s, 0, path, result); 54 return result; 55 }
78.子集
思路:
只要path里面有数据,就把它放到result里面
代码:
1 void subsets_backTrack(vector<int>& nums, int startIndex, vector<int>& path, vector<vector<int>>& result) 2 { 3 if (path.size() > 0) 4 { 5 result.push_back(path); 6 } 7 8 for (int i = startIndex; i < nums.size(); i++) 9 { 10 path.push_back(nums[i]); 11 subsets_backTrack(nums, i + 1, path, result); 12 path.pop_back(); 13 } 14 } 15 vector<vector<int>> subsets(vector<int>& nums) { 16 vector<vector<int>> result; 17 result.push_back({}); 18 if (nums.size() == 0)return result; 19 vector<int>path; 20 subsets_backTrack(nums, 0, path, result); 21 22 return result; 23 }
90.子集II
注意:
去重操作需要先排序,否则会出现问题
代码:
1 //不应该排序,应该是Set,因为我只要当前的结果里面没有,但并不代表不能出现22所以,仅是当前 2 void subsetsWithDup_trackBack(vector<int>& nums, int startIndex, vector<int> &path, vector<vector<int>> &result) 3 { 4 result.push_back(path); 5 6 set<int> selected; 7 for (int i = startIndex; i < nums.size(); i++) 8 { 9 if (selected.find(nums[i])==selected.end()) 10 { 11 selected.insert(nums[i]); 12 } 13 else 14 { 15 continue; 16 } 17 18 path.push_back(nums[i]); 19 subsetsWithDup_trackBack(nums, i + 1, path, result); 20 path.pop_back(); 21 } 22 } 23 vector<vector<int>> subsetsWithDup(vector<int>& nums) { 24 vector<vector<int>> result; 25 if (nums.size() == 0) return result; 26 vector<int> path; 27 sort(nums.begin(), nums.end()); 28 subsetsWithDup_trackBack(nums, 0, path, result); 29 return result; 30 }