描述
给一个由数字组成的字符串。求出其可能恢复为的所有IP地址。
样例
给出字符串 "25525511135"
,所有可能的IP地址为:
[
"255.255.11.135",
"255.255.111.35"
]
(顺序无关紧要)
实现:回溯法
public class Solution {
/**
* @param s: the IP string
* @return: All possible valid IP addresses
*/
List<List<String>> res=new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
if(s==null) return null;
List<String> result=new ArrayList<>();
if(s.length()<4) return result;
List<String> list=new ArrayList<>();
restoreIpAddresses(s, 0, list);
for(List<String> l: res){
boolean b=false;
StringBuilder sb=new StringBuilder();
for(String str: l){
if(str.length()>1 && str.charAt(0)=='0'){
b=true;
continue;
}
sb.append(str);
sb.append(".");
}
if(b) continue;
sb.deleteCharAt(sb.length()-1);
result.add(sb.toString());
}
return result;
}
int len=0;
private void restoreIpAddresses(String s, int start, List<String> list){
if(start>s.length()) return;
if(start==s.length() && list.size()==4 && len==s.length()){
res.add(new ArrayList<>(list));
}
else{
for(int i=start; i<s.length(); i++){
for(int j=1; j<4; j++){
if(i+j>s.length()) return;
String st=s.substring(i, i+j);
int temp=Integer.parseInt(st);
if(temp>=0 && temp<=255){
list.add(st);
len+=st.length();
restoreIpAddresses(s, i+j, list);
list.remove(list.size()-1);
len-=st.length();
}
else return;
}
}
}
}
}