93.复原ip地址
题解:dfs+剪枝,使用一个集合path用来存储每次放入的满足条件的字符串,首先判断字符串的长度,如果大于12或者小于4直接返回一个空的集合。
深度搜索过程中,出口是当满足条件的分段数量达到4并且字符串全部遍历完
的时候,就可以把path放入到我们的集合当中。用一个长度为3的循环进行
剪枝,判断当前字符串是否满足条件,将我们的字符串放入到我们的path中,然后进一步深度搜索,注意要回溯。
class Solution {
private int len;
private String str;
private List<String> ansList;
private Deque<String> path;
public List<String> restoreIpAddresses(String s) {
len = s.length();
str = s;
//判断长度,不满足直接输出
if (str == null || len < 4 || len > 12) {
return new ArrayList<>();
}
ansList=new ArrayList<>();
path=new LinkedList<>();
dfs(0,0);
return ansList;
}
public int judge(int start,int end){
//如果第一个数是0的话,那么只能是一位数,也就是锁start必须等于end
if(str.charAt(start)=='0'&&start!=end){
return -1;
}
int sum=0;
//求出大小
for(int i=start;i<=end;i++){
int x=str.charAt(i)-'0';
sum=sum*10+ (str.charAt(i)-'0');
}
//范围判断
if(sum>255){
return -1;
}
return sum;
}
public void dfs(int start,int cnt) {
//已经被彻底被分成四段,并且长度满足
if(cnt==4&&start==len){
//并且长度满足
ansList.add(String.join(".",path));
}
//剪枝
for(int i=start;i<start+3&&i<len;i++){
//判断是否可以剪枝
int flag=judge(start,i);
if(flag!=-1){
//将满足的分段加入到path中
path.addLast(flag+"");
//继续深搜
dfs(i+1,cnt+1);
//回溯
path.removeLast();
}
}
}
}