93.复原IP地址
有效 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.length <= 20
-
s
仅由数字组成
思路
常规思路回溯,需要加上判断是否有前导0、单串子串大于等于0且小于等于255的判断:
class Solution {
List<String> res=new ArrayList<>();
int[] segments=new int[4];
public List<String> restoreIpAddresses(String s) {
if(s.length()>12||s.length()<4){
return res;
}
dfs(s,0,0);
return res;
}
public void dfs(String s,int id,int begin){
if(id==4){
if(begin==s.length()){
StringBuffer sb=new StringBuffer();
for(int i=0;i<4;i++){
sb.append(segments[i]);
if(i!=3){
sb.append('.');
}
}
res.add(sb.toString());
}
return;
}
if(begin==s.length()){
return;
}
if(s.charAt(begin)=='0'){
segments[id]=0;
dfs(s,id+1,begin+1);
return;
}
int temp=0;
for(int i=begin;i<s.length();i++){
temp=temp*10+(s.charAt(i)-'0');
if(temp>0&&temp<=0xFF){
segments[id]=temp;
dfs(s,id+1,i+1);
}else {
break;
}
}
}
}
78.子集
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的
子集
(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
-
nums
中的所有元素 互不相同
思路
两种方法,一种递归法,另一种迭代法,即将数组每一位是否在数组中存为0或1,这样只要遍历0到1<<n即可遍历所有情况
递归法
class Solution {
List<List<Integer>> res=new ArrayList<>();
List<Integer> path=new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
dfs(0,nums);
return res;
}
private void dfs(int cur,int[] nums){
if(cur==nums.length){
List<Integer> ans=new ArrayList<>(path);
res.add(new ArrayList<>(ans));
return;
}
path.add(nums[cur]);
dfs(cur+1,nums);
path.remove(path.size()-1);
dfs(cur+1,nums);
}
}
迭代法
class Solution {
List<List<Integer>> res=new ArrayList<>();
List<Integer> path=new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
int n=nums.length;
for(int mask=0;mask<(1<<n);mask++){
path.clear();
for (int i=0;i<n;i++){
if ((mask & (1 << i)) != 0) {
path.add(nums[i]);
}
}
res.add(new ArrayList<>(path));
}
return res;
}
}
总结
常规题型。