代码随想录算法训练营第二十三天| 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 }

 

posted @ 2023-07-04 09:30  博二爷  阅读(3)  评论(0编辑  收藏  举报