93.复原IP地址
思路:
本来没有思路,看了下视频的思路讲解再写的代码
参数:
全局变量:
vector<string> result;
string path;
函数变量:
string s, int startIndex,int pointnum
中止变量:
if(pointnum==4)
{
if(startIndex==s.size())
{
path.pop_back();
result.push_back(path);
return;
}
}
单层逻辑:
for(int i=startIndex;i<s.size();i++)
{
string str=s.substr(startIndex,i-startIndex+1);
int num=path.size();//记录初始位置
if(judgelegal(s,startIndex,i))
{
path+=str;
path+='.';
pointnum++;
}
else
continue;
backTracking(s,i+1,pointnum);
path.erase(num,str.size()+1);//使用初始位置和增加的数量进行回退
pointnum--;
}
再写一个判断是否合法的函数
看视频:
可以在s上直接操作,不用额外用path,用insert函数
for (int i = startIndex; i < s.size(); i++) {
if (isValid(s, startIndex, i)) {
s.insert(s.begin() + i + 1 , '.'); // 在i的后面插入一个逗点
pointNum++;
backtracking(s, i + 2, pointNum); // 插入逗点之后下一个子串的起始位置为i+2
pointNum--; // 回溯
s.erase(s.begin() + i + 1); // 回溯删掉逗点
}
}
中止条件:
if (pointNum == 3) { // 逗点数量为3时,分隔结束
// 判断第四段子字符串是否合法,如果合法就放进result中
if (isValid(s, startIndex, s.size() - 1)) {
result.push_back(s);
}
return;
}
78.子集
思路:
变量:
全局变量:
vector<vector<int>> result;
vector<int> path;
函数变量:
vector<int>& nums,int startIndex
中止条件:
由于每一个都要放进result,所以没有中止条件,在最开始result.push_back(path)即可;
单层搜索:
for(int i=startIndex;i<nums.size();i++)
{
path.push_back(nums[i]);
backTracking(nums,i+1);
path.pop_back();
}
看视频后:
注意:子集是每一层递归都要放进结果集
90.子集II
思路:
这道题和上一道题的区别是多了重复的元素,因此可以使用之前在第40题使用的方式进行去重。
全局变量:
vector<vector<int>> result;
vector<int> path;
函数变量:
vector<int>& nums,int startIndex,vector<bool> &used
中止条件:
由于每一个都要放进result,所以没有中止条件,在最开始result.push_back(path)即可;
单层搜索:
需要加一个重复元素是否使用的判断,以及used[i]状态的更改回溯
if(i>0 && nums[i]==nums[i-1] && used[i-1]==false)
continue;
在主函数中记得把nums进行排序,再回溯。
vector<bool> used(nums.size(), false);
看视频后:
思路相同,无补充。