
解题代码
class Solution { List<String> result = new ArrayList<>(); public List<String> restoreIpAddresses(String s) { if(s.length() > 12 ) return result; //剪枝操作 backtracking(s,0,0); return result; } public void backtracking(String s, int startIndex, int pointNum ) { if(pointNum == 3 ) { //逗号数量为3,分割结束 // 判断第四段子字符串是否合法,如果合法就放进result中 if(isValid(s,startIndex,s.length()-1 ) ) { result.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); // 插⼊逗点之后下⼀个⼦串的起始位置为i+2 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; }}