import java.util.*; public class Solution { /** * * @param s string字符串 * @return string字符串ArrayList */ public ArrayList<String> restoreIpAddresses (String s) { //递归 ArrayList<String> res = new ArrayList<>() ; if(s == null || s.length() < 4) return res ; recur(s , 0 , 4 , "" , res) ; return res ; } //思想:处理从index开始的后续字符串如何转换为fra段【如recur(str,0,4,tmp,res)】,处理从str[0]开始的后续字符串 //如何转换为符合要求的4段。每次选择当前的一个从index开始的前导字符串组成当前段,然后把问题转换为剩下的字符串组成剩下 //的段 //1.tmp:当前已经拼接好的段 //2.res:保存结果 public void recur(String str , int index , int fra , String tmp , ArrayList<String> res) { if(fra == 0 && index == str.length()) {//IP地址的所有段都拼接完,而且字符串也刚好用完 res.add(tmp) ; return ; } //拼接的不合适 if(fra == 0 && index != str.length() || fra != 0 && index == str.length()) { return ; } //检测从index往后的几个字符组成的数字满不满足要求[0-255] int i = index + 1 ; int j = 0 ;//最多也只能由三个字符组成 for(; i <= str.length() && j < 3 ; i ++ , j ++) { String cur_str = str.substring(index , i) ;//当前段选择的字符串 if(isOK(cur_str)) { if("".equals(tmp)) {//第一段前面,不拼接‘.’ recur(str , i , fra-1 , tmp+cur_str , res) ; //递归,处理从i开始的后续字符串如何转换为fra-1段 } else { recur(str , i , fra-1 , tmp+"."+cur_str , res) ; } } } } //检测字符串是否满足[0-255],且不含前导0 public boolean isOK(String str) { //有前导0的数字也不合法 if(str.length() >= 2 && str.charAt(0)=='0') return false ; int num = Integer.parseInt(str) ; return num >= 0 && num <= 255 ; } }