93.复原IP地址 文章讲解
思路
和分割回文串类似,只是多加了‘.’
Code
class Solution {
private:
vector<string>result;
void backtracking(string&s,int startIndex,int pointSum)
{
if(pointSum==3){
if(isvalid(s,startIndex,s.size()-1))
{
result.push_back(s);
return;
}
}
for(int i=startIndex;i<s.size();i++)
{
if(isvalid(s,startIndex,i))
{
s.insert(s.begin()+i+1,'.');
pointSum+=1;
backtracking(s,i+2,pointSum);
pointSum--;
s.erase(s.begin()+1+i);
}
else break;
}
}
bool isvalid(const string&s,int start,int end){
if(start>end){
return false;
}
if(s[start]=='0'&&start!=end)
{
return false;
}
int num=0;
for(int i=start;i<=end;i++)
{
if(s[i]>'9'||s[i]<'0'){return false;}
num=num*10+(s[i]-'0');
if(num>255){
return false;
}
}
return true;
}
public:
vector<string> restoreIpAddresses(string s) {
result.clear();
if(s.size()<4||s.size()>12)return result;
backtracking(s,0,0);
return result;
}
};
78.子集 题目链接
思路
抽象为树形结构,收集每个节点
解题方法
递归函数:
参数:nums,startIndex。
终止条件:当startIndex>=nums.size(),就return.
单层递归逻辑:for循环遍历,注意i要从startIndex开始,否则会有重复
Code
class Solution {
private:
vector<vector<int>>result;
vector<int>path;
void backtracking(vector<int>&nums,int startIndex)
{
result.push_back(path);
if(startIndex>=nums.size())return;
for(int i=startIndex;i<nums.size();i++)
{
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
result.clear();
path.clear();
backtracking(nums,0);
return result;
}
};
复杂度
时间复杂度:
O(n*2^n)
空间复杂度:
O(n)
90.子集II
思路
要对树层去重
解题方法
先排序。
递归函数:
参数:nums,startIndex,used
单层递归逻辑:for循环:对树层去重:i>0,当nums[i]==nums[i-1]时,且used[i-1]==false;说明这个相等的值已经使用过了,跳转。
Code
class Solution {
private:
vector<int>path;
vector<vector<int>>result;
void backtracking(vector<int>&nums,int startIndex,vector<bool>&used)
{
result.push_back(path);
for(int i=startIndex;i<nums.size();i++)
{
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false)
{
continue;
}
path.push_back(nums[i]);
used[i]=true;
backtracking(nums,i+1,used);
path.pop_back();
used[i]=false;
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
result.clear();
path.clear();
vector<bool>used(nums.size(),false);
sort(nums.begin(),nums.end());
backtracking(nums,0,used);
return result;
}
};
复杂度
时间复杂度:
O(n*2^n)
空间复杂度:
O(n)