93.复原IP地址
题目:力扣
class Solution {
public:
vector<string> result;
string ans = "";
bool is_able(string s){
int t = atoi(s.c_str());
if(t >= 0 && t <= 255 ) {
if(s[0] == '0' && s.size() != 1) return false;
else{
return true;
}
}
return false;
}
void backtracking(string s,int start,int num){
if(num > 4) return;
if(num == 4 && start == s.size()){
result.push_back(ans);
return;
}
for(int i = start; i < s.size(); ++i){
string temp = s.substr(start,i - start + 1);
if(is_able(temp)){
num++;
if(num < 4){
temp += ".";
}
ans += temp;
backtracking(s,i+1,num);
num--;
ans = ans.substr(0,ans.size() - temp.size());
}else{
break;
}
}
}
vector<string> restoreIpAddresses(string s) {
backtracking(s,0,0);
return result;
}
};
78.子集
题目:力扣
class Solution {
public:
vector<vector<int> > result;
vector<int> ans;
void backtracking(vector<int>& nums,int start){
result.push_back(ans);
for(int i = start; i < nums.size(); ++i){
ans.push_back(nums[i]);
backtracking(nums,i+1);
ans.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
backtracking(nums,0);
return result;
}
};
90.子集II
题目:力扣
class Solution {
public:
vector<vector<int> > result;
vector<int> ans;
void backtracking(vector<int>& nums,int start){
result.push_back(ans);
for(int i = start; i < nums.size(); ++i){
if(i > start && nums[i] == nums[i - 1]) continue;
ans.push_back(nums[i]);
backtracking(nums,i+1);
ans.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
backtracking(nums,0);
return result;
}
};
总结
题型:分割子串,子集
技巧:
字符串转int
(1)atoi
#include <iostream>
#include <stdlib.h>
int main()
{
std::string str = "666";
std::cout << atoi(str.c_str());
return 0;
}
(2)istringstream
#include <iostream>
#include <sstream>
int main()
{
std::string str = "666";
int num = 0;
std::istringstream ss(str);
ss >> num;
std::cout << num;
return 0;
}