题意:
思路:要分成合法的ip地址,实际上字符串s的有效长度最长为12。因此我们可以考虑回溯算法。
将字符串分成4段,对每一段进行考虑。segStart每一段的第一个元素,它需要特殊考虑为0的情况,为0的话就只能自己作为单独一段,接着递归求下一段。
class Solution {
ArrayList<String> list = new ArrayList<String>();
Integer[] segment = new Integer[4];
public List<String> restoreIpAddresses(String s) {
dfs(s,0,0);
return list;
}
public void dfs(String s,int segNum,int segStart){
//分成四段且字符串刚好遍历完
if(segNum == 4 && segStart == s.length()){
StringBuilder ip = new StringBuilder();
for(int i = 0; i < 4; i++){
ip.append(segment[i].toString());
if(i != 3)
ip.append(".");
}
list.add(ip.toString());
return;
}
//字符串还没遍历完或者字符串遍历完了但是没有分成四段
if(segNum == 4 || segStart == s.length())
return;
//每一段的数值不能含有前导零,如果有前导零,0只能单独作为一段
if(s.charAt(segStart) == '0'){
segment[segNum] = 0;
dfs(s,segNum + 1,segStart + 1);
}
int addr = 0;
for(int i = segStart; i < s.length(); i++){
addr = addr * 10 + (s.charAt(i) - '0');
if(addr > 0 && addr <= 255){
segment[segNum] = addr;
dfs(s,segNum + 1,i + 1);
} else{
break;
}
}
}
}