有效 IP 地址 正好由四个整数(每个整数位于 0
到 255
之间组成,且不能含有前导 0
),整数之间用 '.'
分隔。
- 例如:
"0.1.2.201"
和"192.168.1.1"
是 有效 IP 地址,但是"0.011.255.245"
、"192.168.1.312"
和"192.168@1.1"
是 无效 IP 地址。
给定一个只包含数字的字符串 s
,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s
中插入 '.'
来形成。你 不能 重新排序或删除 s
中的任何数字。你可以按 任何 顺序返回答案。
示例 1:
输入:s = "25525511135" 输出:["255.255.11.135","255.255.111.35"]
示例 2:
输入:s = "0000" 输出:["0.0.0.0"]
示例 3:
输入:s = "101023" 输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
提示:
1 <= s.length <= 20
s
仅由数字组成
class Solution {
vector<string> ans;
string path;
void backTracking(int startIndex, string s,int height){
if(height==4){
cout<<path<<endl;
if(path.size()-3==s.size()){
ans.push_back(path);
}
return;
}
string m="";
for(int i=startIndex;i<s.size()&&i<startIndex+3;i++){
if(m==""&&s[i]=='0'){
path.push_back(s[i]);
if(height!=3)path.push_back('.');
backTracking(i+1,s,height+1);
if(height!=3)path.pop_back();
path.pop_back();
break;
}
m+=s[i];
if(i==startIndex+2){
if(m[0]>'2'||(m[0]=='2'&&m[1]>'5')||(m[0]=='2'&&m[1]=='5'&&m[2]>'5')){
}else{
path+=m;
if(height!=3)path.push_back('.');
backTracking(i+1,s,height+1);
if(height!=3)path.pop_back();
path.resize(path.size()-m.size());
}
continue;
}
path+=m;
if(height!=3)path.push_back('.');
backTracking(i+1,s,height+1);
if(height!=3)path.pop_back();
path.resize(path.size()-m.size());
}
}
public:
vector<string> restoreIpAddresses(string s) {
backTracking(0,s,0);
return ans;
}
};
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0] 输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums
中的所有元素 互不相同
class Solution {
vector<vector<int>> ans;
vector<int> path;
void backTracking(vector<int>nums,int startIndex){
ans.push_back(path);
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 ans;
}
};
给你一个整数数组 nums
,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例 1:
输入:nums = [1,2,2] 输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
示例 2:
输入:nums = [0] 输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
使用set去重;
set的添加函数为insert,这个要记住;
代码随想录上有用bool数组去重的,可以借鉴一下;
我们主要介绍一下去重逻辑:
就一句话:
不能在递归树的同一层使用同一个数字
class Solution {
vector<vector<int>>ans;
vector<int> path;
void backTracking(vector<int> nums,int startIndex){
ans.push_back(path);
unordered_set<int> used;
for(int i=startIndex;i<nums.size();i++){
if(used.find(nums[i])!=used.end())continue;
used.insert(nums[i]);
path.push_back(nums[i]);
backTracking(nums,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
backTracking(nums,0);
return ans;
}
};
最后写一下今日感悟:
1. 学习思维的转变,这里我称之为(赏金猎人);不是自己要学习多少,而是尝试去明白学习这些东西是为了什么,用这些东西又可以做些什么。
2. 学习技术方面的:(计算机方面借鉴)学一门技术要考虑,用这个技术栈,你能做些什么,不能一股脑光学,只会浪费大量时间,而且我觉得学习效果不一定比实战派效率高(有待验证);
以上只是个人看法,希望对大家技术的提升能有点启发