class Solution {
/**
思路: 1.跟分割字符串差不多,但是我们需要记录添加的'.'的个数 当其个数等于3的时候
我们就已经切割成4段了。
2.判断字符是否合法
1>:以0开头的数字不合法
2>:遇见非数字字符不合法
3>:大于255不合法
*/
private List<String> ans = new ArrayList<>();
public boolean isValid(String str,int start,int end) {
if (start > end) return false;//防止字符串的起始位置大于字符串长度
//这里使保证前导树不为0,同时单个0是可以的
if (str.charAt(start) == '0' && start != end) return false;
int num = 0;
for (int i = start; i <= end; i++) {
//字符也是对应数字的 如果超过范围那就不是字符对应数字的范围了
if (str.charAt(i) < '0' || str.charAt(i) > '9') return false;
num = num * 10 + (str.charAt(i)-'0');
if (num > 255) return false;
}
return true;
}
public void getAns(String str,int st,int point) {
if (point == 3) {//字符串中3个逗号就可以将字符串分割成4段
if (isValid(str,st,str.length()-1)) {
System.out.println(str);
ans.add(str);
}
return ;
}
for (int i = st; i < str.length(); i++) {
if (isValid(str,st,i)) {
str = str.substring(0,i+1) + "." + str.substring(i+1);
point++;
getAns(str,i+2,point);//这里st+2是因为我们上方还插入了一个 . ;
point--;
//a b c . d
//0 1 2 3 4 想要截取为abcd 那么就是[0,3) +[4,最后) 其中i为2;
str = str.substring(0,i+1) + str.substring(i+2);
} else {//如果遇见不合法的字段那就没必要再进行横向遍历了
break;
}
}
}
public List<String> restoreIpAddresses(String s) {
getAns(s,0,0);
return ans;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)