- ip地址有四个数字片段,在树高为4的时候需要停止,用小数点pointNum的个数表示,如果小数点已经有三个了,则表示即将结束。
- ip的数据段的合法性判断:数字在0-255,如果非0第一个数字不能是0,数据段之间用 . 分隔。
- 在合法的数据段后面加入 . :字符串的操作,在某个位置插入一个字符s.insert(),删除一个字符s.erase()。
- 回溯的三部曲:
- 参数和返回值:参数s即提供原来的字符串,又生成ip;参数startIndex指明开始遍历位置;参数pointNum指出现在已经加入小数点的个数,有利于表示结束条件。
- 终止条件:pointNum == 3
- 单层逻辑:借助for循环中的i生成[startIndex, i]的字符串,字符串合法在后面加入’.'并且从小数点后面的第一个字符开始纵向遍历。
- 与n个数中取k个为集合的不同在于,result中保存的不是到达叶子的值,而是树枝。有多少个树枝,就需要在result中保存几项。
- 回溯三部曲:
- 返回值和参数:参数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();
}
- 树层去重的操作
- 递归三部曲:
- 参数和返回值: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();
}