注意非法的几种情况,以及添加逗号后的处理
#include<string>
using namespace std;
class Solution {
public:
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;
}
vector<string> res;
void buildip(string& s,int index,int pointnum)
{
if(pointnum == 3)
{
if(isvalid(s,index,s.size()-1))
{
res.push_back(s);
}
return;
}
for(int i = index;i <= s.size()- 1;i++)//最后一位可以是单数,所以需要<=
{
if(isvalid(s,index,i))
{
s.insert(s.begin() + i + 1,'.');
pointnum++;
buildip(s,i+2,pointnum);//注意加入逗号后,i需要加2,防止逗号代来影响
pointnum--;
s.erase(s.begin() + i + 1);
}
}
}
vector<string> restoreIpAddresses(string s) {
buildip(s,0,0);
return res;
}
};
简单没什么好说的
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void backtracking(vector<int>& nums,int index)
{
res.push_back(path);
if(index > nums.size()-1) return;
for(int i = index; i < nums.size() ; i++)
{
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums)
{
res.clear();
path.clear();
backtracking(nums,0);
return res;
}
};
简单,前面好像有个类似的
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void backtracking(vector<int>& nums,int index)
{
res.push_back(path);
if(index > nums.size() - 1 ) return;
for(int i = index ; i < nums.size(); i++)
{
if(i != index && nums[i] == nums[i-1]) continue;
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
res.clear();
path.clear();
sort(nums.begin(),nums.end());
backtracking(nums,0);
return res;
}
};