万事开头难,日拱一卒地前进吧。
DAY30
93复原ip地址
十分困难,有很多细节。加油吧,日拱一卒的前进,毕竟万事开头难。
待二刷。
- class Solution {
- private:
- bool isip(string s,int left,int right){
- if(left>right) return false;
- if(s[left]=='0'&&left!=right) return false;
- int num=0;
- for(int i=left;i<=right;i++){
- if(s[i]<'0'||s[i]>'9'){
- return false;
- }
- num=num*10+(s[i]-'0');
- if(num>255) return false;
- }
- return true;
- }
- vector<string>result;
- void backtracking(string &s,int startindex,int pointsum){
- if(pointsum==3){
- if(isip(s,startindex,s.size()-1)) result.push_back(s);
- return ;
- }
- for(int i=startindex;i<s.size();i++){
- if(isip(s,startindex,i)){
- s.insert(s.begin()+i+1,'.');
- pointsum++;
- backtracking(s,i+2,pointsum);
- s.erase(s.begin()+i+1);
- pointsum--;
- }else break;
- }
- }
- public:
- vector<string> restoreIpAddresses(string s) {
- result.clear();
- if(s.size()<4||s.size()>12) return result;
- backtracking(s,0,0);
- return result;
- }
- };
78子集
与之前的回溯不同,子集问题的答案存在于树形结构的每一个节点当中。
待二刷:
- 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();
- if(nums.size()==0) return result;
- backtracking(nums,0);
- return result;
- }
- };
90子集ii
- class Solution {
- private:
- vector<vector<int>> result;
- vector<int> path;
- 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);
- path.pop_back();
- used[i]=false;
- }
- }
- public:
- vector<vector<int>> subsetsWithDup(vector<int>& nums) {
- result.clear();
- path.clear();
- if(nums.size()==0) return result;
- sort(nums.begin(),nums.end());
- vector<bool>used(nums.size(),false);
- backtracking(nums,0,used);
- return result;
- }
- };