数字字符串转化为IP地址
描述
现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。、
解题
Solution
/**
* 字符串转IP地址
* IP地址为4个整数(0-255),深度遍历+回溯法
*/
import java.util.ArrayList;
public class Solution {
public ArrayList<String> restoreIpAddresses(String s){
ArrayList<String> list = new ArrayList<>();//创建字符串链表
if (s.length()==0) return list;
backTrack(s,0,3,list);//深度回溯,i表示插入起始位置,count表示点数
return list;
}
private void backTrack(String s, int i, int count, ArrayList<String> list) {
if (count==0){
String[] strs = s.split("\\.");//拆分字符串,转义.
if (strs.length<4) return;//长度不为4,则划分错误
for (String str:strs){
if (str.length()>1&&str.charAt(0)=='0') return;//地址不是个位数,便不能以0为起始
if (Integer.parseInt(str)<0||Integer.parseInt(str)>255) return;//地址大小在0-255
}
list.add(s);
}else {
if (i>=s.length()) return;//无位置可插入
backTrack(s.substring(0,i+1)+'.'+s.substring(i+1,s.length()),i+2,count-1,list);//在一位数字后插入.
if (i+2<s.length()) backTrack(s.substring(0,i+2)+'.'+s.substring(i+2,s.length()),i+3,count-1,list);//在两位数字后插入.
if (i+3<s.length()) backTrack(s.substring(0,i+3)+'.'+s.substring(i+3,s.length()),i+4,count-1,list);//在三位数字后插入.
}
}
}