思路
这个和切割回文串很类似,就是在切割后要判断下是否是ip地址。
这个的判断字符串是否是在0~255用的是ASCII码判断的,值得借鉴。
代码
class Solution {
List<String> res = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
backtracking(s,0,0);
return res;
}
public void backtracking(String s,int startIndex,int pointnum){
if(pointnum == 3){
if(isValid(s,startIndex,s.length()-1)){
res.add(s);
return;
}
}
for(int i= startIndex;i<s.length();i++){
if(isValid(s,startIndex,i)){
s = s.substring(0, i + 1) + "." + s.substring(i + 1);//加入.
pointnum++;
backtracking(s,i+2,pointnum);
pointnum--;
s = s.substring(0, i + 1) + s.substring(i + 2);// 回溯删掉逗点
}else{
break;
}
}
}
public boolean isValid(String s,int start,int end){
if (start > end) {
return false;
}
if (s.charAt(start) == '0' && start != end) { // 0开头的数字不合法
return false;
}
int num = 0;
for (int i = start; i <= end; i++) {
if (s.charAt(i) > '9' || s.charAt(i) < '0') { // 遇到⾮数字字符不合法
return false;
}
num = num * 10 + (s.charAt(i) - '0');
if (num > 255) { // 如果⼤于255了不合法
return false;
}
}
return true;
}
}