QUESTION:
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
示例:
输入: “25525511135” 输出: [“255.255.11.135”, “255.255.111.35”]
EXPLANATION:
说实话,我觉得leetcode中国上的这些破题目挺蠢的。自己不说限定条件,只把题目一摆,虽然有些testcase是肯定会想到的,但是还有一些就很烦。好了,不吐槽这个了,这道题目是典型的回溯算法,回溯算法的公式其实百度上也有就是如果条件满足添加到结果中,否则就继续进行迭代。
只要把这个思路套在公式里就可以。
立即如下:
1.首先从第一位开始,因为每个ip地址的分段只能包含最多3个数
2.然后将结果和当前的index传给下次循环
3.在循环到第三次的时候,可以看一下剩下的字符是否满足,如果满足则说明可以添加到结果中
这样就将每个分段都进行了1-3次的遍历,这样就可以得到对应的结果。
SOLUTION:
class Solution {
public List<String> restoreIpAddresses(String s) {
ArrayList<String> result = new ArrayList<>();
if(s.length()>12) return result;
restoreIpAddressesHelper(result,0,0,"",s);
return result;
}
public static void restoreIpAddressesHelper(ArrayList result,int start,int count,String tmp ,String s){
if(count == 3 && restoreIpAddressesUtils(s.substring(start,s.length()))){
result.add(tmp+s.substring(start,s.length()));
}else{
if(count<=2){
for(int i = 1;i<=3;i++){
if(start+i<s.length()){
String i_tmp = s.substring(start,start+i);
if(restoreIpAddressesUtils(i_tmp)){
i_tmp = tmp+i_tmp+".";
restoreIpAddressesHelper(result,start+i,count+1,i_tmp,s);
}
}
}
}
}
}
public static boolean restoreIpAddressesUtils(String s){
if(s.isEmpty()) return false;
if(s.length()>1 && s.startsWith("0")) return false;
int num = Integer.parseInt(s);
return num>=0 && num<=255;
}
}