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 ;
}
}