目录
🎈LeetCode93.复原IP地址
🎈LeetCode78.子集
🎈 LeetCode90.子集||
🎈LeetCode93.复原IP地址
链接: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
中的任何数字。你可以按 任何 顺序返回答案。
List<String> result = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
StringBuilder sb = new StringBuilder(s);
backTracking(sb, 0, 0);
return result;
}
private void backTracking(StringBuilder s, int startIndex, int dotCount){
if(dotCount == 3){
if(isValid(s, startIndex, s.length() - 1)){
result.add(s.toString());
}
return;
}
for(int i = startIndex; i < s.length(); i++){
if(isValid(s, startIndex, i)){
s.insert(i + 1, '.');
backTracking(s, i + 2, dotCount + 1);
s.deleteCharAt(i + 1);
}else{
break;
}
}
}
//[start, end]
private boolean isValid(StringBuilder s, int start, int end){
if(start > end) {
return false;
}
if(s.charAt(start) == '0' && start != end) {
return false;
}
int num = 0;
for(int i = start; i <= end; i++){
int digit = s.charAt(i) - '0';
num = num * 10 + digit;
if(num > 255) {
return false;
}
}
return true;
}
🎈LeetCode78.子集
链接:78.子集
给你一个整数数组
nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
List<Integer> path;
List<List<Integer>> result;
public List<List<Integer>> subsets(int[] nums) {
path=new ArrayList<>();
result=new ArrayList<>();
backtracking(nums,0);
return result;
}
public void backtracking(int[] nums,int startIndex){
if(startIndex>nums.length){
return;
}
result.add(new ArrayList<>(path));
for(int i=startIndex;i<nums.length;i++){
path.add(nums[i]);
backtracking(nums,i+1);
path.remove(path.size()-1);
}
}
🎈 LeetCode90.子集||
链接:90.子集||
给你一个整数数组
nums
,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
List<Integer> path;
List<List<Integer>> result;
public List<List<Integer>> subsetsWithDup(int[] nums) {
path=new ArrayList<>();
result=new ArrayList<>();
Arrays.sort(nums);
boolean[] used=new boolean[nums.length];
backtracking(nums,0,used);
return result;
}
public void backtracking(int[] nums,int startIndex,boolean[] used){
if(startIndex>nums.length){
return;
}
result.add(new ArrayList<>(path));
for(int i=startIndex;i<nums.length;i++){
if(i>0 && nums[i]==nums[i-1] && used[i-1]==false){
continue;
}
used[i]=true;
path.add(nums[i]);
backtracking(nums,i+1,used);
used[i]=false;
path.remove(path.size()-1);
}
}