!!Day28_93复原IP地址_78子集_90子集Ⅱ

文章目录

      • [93 复原IP地址](https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html#%E6%80%9D%E8%B7%AF)
      • [78 子集](https://programmercarl.com/0078.%E5%AD%90%E9%9B%86.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE)
      • [90 子集Ⅱ](https://programmercarl.com/0090.%E5%AD%90%E9%9B%86II.html#%E6%80%9D%E8%B7%AF)

93 复原IP地址

  1. ip地址有四个数字片段,在树高为4的时候需要停止,用小数点pointNum的个数表示,如果小数点已经有三个了,则表示即将结束。
  2. ip的数据段的合法性判断:数字在0-255,如果非0第一个数字不能是0,数据段之间用 . 分隔。
  3. 在合法的数据段后面加入 . :字符串的操作,在某个位置插入一个字符s.insert(),删除一个字符s.erase()。
  4. 回溯的三部曲:
  • 参数和返回值:参数s即提供原来的字符串,又生成ip;参数startIndex指明开始遍历位置;参数pointNum指出现在已经加入小数点的个数,有利于表示结束条件。
  • 终止条件:pointNum == 3
  • 单层逻辑:借助for循环中的i生成[startIndex, i]的字符串,字符串合法在后面加入’.'并且从小数点后面的第一个字符开始纵向遍历。

78 子集

  1. 与n个数中取k个为集合的不同在于,result中保存的不是到达叶子的值,而是树枝。有多少个树枝,就需要在result中保存几项。
  2. 回溯三部曲:
  • 返回值和参数:参数nums作为提供基础的数据,startIndex表示本次开始的位置。
  • 终止条件:剩余集合为空表示到达叶子节点。
if(startIndex == nums.size()) return;
  • 单层逻辑:
for(int i = startIndex; i< nums.size(); i++){
	path.push_back(nums[i]);
	result.push_back(path); //保存树的每一个分支(不同之处)
	backtracking(nums, i+1);
	path.pop_back();//回溯
}

90 子集Ⅱ

  1. 树层去重的操作
  2. 递归三部曲:
  • 参数和返回值:nums和startIndex。
  • 终止条件:集合为空
if(startIndex == nums.size()) return;
  • 单层逻辑
for(int i = startIndex; i < nums.size(); i++){
	if(i > 0 && nums[i] == nums[i-1] && i > startIndex) continue;//同层出现相同元素,为避免重复,退出
	path.push_back(nums[i]);
	result.push_back(path);//保存树的每一个分支
	backtracking(nums, i+1);
	path.pop_back();
}

你可能感兴趣的:(算法,力扣,数据结构,leetcode)