题目链接:LeetCode93
欢迎留言交流,每天都会回消息。
java
class Solution {
//定义结果集,返回最终结果
List<String> rs = new ArrayList<>();
public List<String> restoreIpAddresses(String s) {
//将字符串包装为可变长度的字符串
StringBuilder sb = new StringBuilder(s);
backTracking(sb, 0, 0);
return rs;
}
//sb:传入的字符串
//startIdx:用于记录在那个位置分割字符串
//dotCount:IP中 '.' 的个数
void backTracking(StringBuilder sb, int startIdx, int dotCount){
//'.'的个数为3的时候
if(dotCount == 3){
//判断最后一个 '.' 后面剩余的字符是否复合规则
if(isValid(sb, startIdx, sb.length() - 1)){
rs.add(sb.toString());
}
return;
}
for(int i = startIdx; i < sb.length(); i++){
//如果字符合法
if(isValid(sb, startIdx, i)){
//字符后面插入'.'
sb.insert(i + 1, '.');
//递归
backTracking(sb, i + 2, dotCount + 1);
//回溯
sb.deleteCharAt(i + 1);
}else{
break;
}
}
}
//判断start到end这段字符是否为有效的字符
private boolean isValid(StringBuilder s, int start, int end){
if(start > end){
return false;
}
//首字母为零,而且字母数大于等于2的字串:013
if(s.charAt(start) == '0' && start != end){
return false;
}
int num = 0;
//遍历start到end字符将字符转换为数字,将数值和255比较大小
for(int i = start; i <= end; i++){
int digit = s.charAt(i) - '0';
num = num * 10 + digit;
if(num > 255){
return false;
}
}
return true;
}
}