代码随想录算法训练营Day28| 回溯算法part04
一、93.复原IP地址
class Solution {
List<String> result=new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
StringBuilder sb=new StringBuilder(s);
backTracking(sb,0,0);
return result;
}
public void backTracking(StringBuilder s,int startIndex,int pointSum){
if(pointSum==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,pointSum+1);
s.deleteCharAt(i+1);
}
else {
break;
}
}
}
public 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 temp=s.charAt(i)-'0';
num=num*10+temp;
if(num>255){
return false;
}
}
return true;
}
}
二、78.子集
class Solution {
List<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> subsets(int[] nums) {
subsetsHelper(nums, 0);
return result;
}
private void subsetsHelper(int[] nums, int startIndex){
result.add(new ArrayList<>(path));
for (int i = startIndex; i < nums.length; i++){
path.add(nums[i]);
subsetsHelper(nums, i + 1);
path.removeLast();
}
}
}
三、 90.子集II
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> subsetsWithDup( int[] nums ) {
Arrays.sort( nums );
subsetsWithDupHelper( nums, 0 );
return res;
}
private void subsetsWithDupHelper( int[] nums, int start ) {
res.add( new ArrayList<>( path ) );
for ( int i = start; i < nums.length; i++ ) {
if ( i > start && nums[i - 1] == nums[i] ) {
continue;
}
path.add( nums[i] );
subsetsWithDupHelper( nums, i + 1 );
path.removeLast();
}
}
}