Leetcode 93. 复原 IP 地址
题目链接 93 复原 IP 地址
本题目也是分割的典型题目,属于分割回文子串的升级版,大概的思路都是一样的,注意几点,第一个是对ip地址正确与否的条件,第二个插入逗点后,下一个子串的起始位置为i+2,第三就是对于分割区间开闭的不变性和区间范围的取值([startIndex,i]),最后就是这里不仅要对单个区间段进行ip地址的判断,当pointNum==3时要对第四段ip地址进行判断,下面上代码:
class Solution {
private:
vector<string> result;
void backtracking(string&s,int startIndex,int pointNum){
if(pointNum == 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,'.');
pointNum++;
backtracking(s,i+2,pointNum);//插入逗点之后下一个子串的起始位置为i+2
pointNum--;//回溯
s.erase(s.begin()+i+1);//删除逗点
}else{
break;
}
}
}
bool isValid(const string& s,int start,int end){
if(start>end){//区间不存在
return false;
}
if(s[start] == '0'&&start!=end){//头数字不能为0
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');//不能大于255
if(num>255){
return false;
}
}
return true;
}
public:
vector<string> restoreIpAddresses(string s) {
if(s.size()<4||s.size()>12){//小小剪枝一下啊
return result;
}
backtracking(s,0,0);
return result;
}
};
Leetcode 78. 子集
题目链接 78 子集
本题目和组合几乎是一样的,只有一点不同就是组合取得是叶子节点,而子集是取的全部节点,剩下的都一样,下面上代码:
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
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) {
backtracking(nums,0);
return result;
}
};
Leetcode 90. 子集 II
题目链接 90 子集 II
本题目就是子集1加上组合总和2的去重问题,不多说直接上代码:
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
vector<int> used;
void backtracking (vector<int> &nums,int startIndex,vector<bool> & used){
result.push_back(path);
if(startIndex>=nums.size()){
return ;
}
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);
used[i] = false;
path.pop_back();
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<bool> used(nums.size(), false);//初始化
sort(nums.begin(),nums.end());
backtracking(nums,0,used);
return result;
}
};
要学习六级了,好痛苦 end