有效 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 中的任何数字。你可以按 任何 顺序返回答案。
分析:本题难度较大,与上一道分割回文子串有些类似,同样需要一个辅助函数来判断字符子串是否是ip地址,而本题多了次数的限制,即不多不少,必须分成4个,那么在传递参数的时候要将当前切割次数传递过去
还有一个特别的点,由于一次添加的不是一个字符,而是一个字符串,用StringBuilder来记录path,并使用deleteCharAt(path.length-1)来回溯就不好使了,本题为了可以继续记录回溯过程,直接在字符串s上进行变动,这也是没有办法的办法
参考代码:
public List
sup(s,0,0);
return ret;
}
List
//cut为分割次数,只能分割3次,不多不少,所以在分割3次后,就要判断是否可以加入结果集,并结束最终的递归
private void sup(String s,int index,int cut){
if(cut==3){
if(isvalid(s,index,s.length()-1)){
ret.add(s);
}
return;
}
for(int i=index;i
cut++;
//在字符串s上使用子串拼接的方式来记录回溯过程
s=s.substring(0,i+1)+”.”+s.substring(i+1);
sup(s,i+2,cut);
cut—;
s=s.substring(0,i+1)+s.substring(i+2);
}
}
//判断字符子串是否为有效IP地址
private boolean isvalid(String 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++){
if(s.charAt(i)<’0’||s.charAt(i)>’9’) return false;
num=num*10+(s.charAt(i)-‘0’);
if(num>255) return false;
}
return true;
}
