Leetcode 93. 复原 IP 地址
题目链接 93 复原 IP 地址
本题目也是分割的典型题目,属于分割回文子串的升级版,大概的思路都是一样的,注意几点,第一个是对ip地址正确与否的条件,第二个插入逗点后,下一个子串的起始位置为i+2,第三就是对于分割区间开闭的不变性和区间范围的取值([startIndex,i]),最后就是这里不仅要对单个区间段进行ip地址的判断,当pointNum==3时要对整体ip地址进行判断,下面上代码:
- class Solution {
- private:
- vector
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
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
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
int>> result; - void backtracking (vector<int> &nums,int startIndex){
- result.push_back(path);//和组合唯一的区别,就是把全部的节点都收集
- if(startIndex >= nums.size()){
- return ;
- }
- for(int i=startIndex;i
size();i++){ - path.push_back(nums[i]);
- backtracking(nums,i+1);
- path.pop_back();
- }
- }
- public:
- 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
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
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
int>> subsetsWithDup(vector<int>& nums) { - vector<bool> used(nums.size(), false);//初始化
- sort(nums.begin(),nums.end());
- backtracking(nums,0,used);
- return result;
- }
- };
要学习六级了,好痛苦 end