数字字符串转IP
题目描述
现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。
例如:
给出的字符串为"25525511135",
返回[“255.255.11.135”, “255.255.111.35”]. (顺序没有关系)
代码
import java.util.*;
public class Solution {
/**
*
* @param s string字符串
* @return string字符串ArrayList
*/
public ArrayList<String> res = new ArrayList<>();
public int[] seg_Digit = new int[4];
public ArrayList<String> restoreIpAddresses (String s) {
// write code here
dfs(s,0,0);
return res;
}
public void dfs(String s, int seg_Id, int p){
//当已经完成4段且使用了全部字符时,记录结果
if(seg_Id == 4){
if(p == s.length()){
StringBuilder sb = new StringBuilder();
for(int i=0; i<4; i++){
sb.append(seg_Digit[i]);
if(i < 3){
sb.append('.');
}
}
res.add(sb.toString());
}
return;
}
//当未完成4段但已经耗完字符时,无结果直接返回
if(p == s.length()) return;
//当段开头指针指向字符为0时,
if(s.charAt(p) == '0'){
seg_Digit[seg_Id] = 0;
dfs(s, seg_Id+1, p+1);
return;
}
//深度优先探索一个、两个、三个字符组成数字的结果
int w = 0;
//只取1-3字符组成数字,若没有3个,就去剩下的长度
for(int i=p; i < (s.length()-p>=3?p+3:s.length()); i++){
w = 10*w + (s.charAt(i)-'0');
if(w>0 && w<=255){
seg_Digit[seg_Id] = w;
dfs(s,seg_Id+1,i+1);
}else {
break;
}
}
}
}