题目描述:
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。1
示例:
输入: “25525511135”
输出: [“255.255.11.135”, “255.255.111.35”]
-
分析:
- 采用回溯法:
-
代码:
private int count;
public List<String> restoreIpAddresses(String s) {
List<String> res = new ArrayList<>();
if(s.equals("")) return res;
helper(s,0,"",res);
return res;
}
public void helper(String s,int index,String cur,List<String> res){
if(index >= s.length()){
//一个合法的ip地址一共有四个部分
if(count == 4) res.add(cur.substring(0,cur.length()-1));
return;
}
int len = s.length();
//一位数
if(index + 1 <=s.length() && isValid(s.substring(index,index+1))){
cur += s.substring(index,index+1) + ".";
count++;
//剩余的字符串长度小于等于(剩余ip地址块数*3)
if(len - index - 1 <= 3*(4-count))helper(s,index+1,cur,res);
cur = cur.substring(0,cur.length() - 2);
count --;
}
//两位数
if(index + 2 <=s.length() &&isValid(s.substring(index,index+2))){
cur += s.substring(index,index+2) + ".";
count++;
if(len - index - 2 <= 3*(4-count)) helper(s,index+2,cur,res);
cur = cur.substring(0,cur.length() - 3);
count--;
}
//三位数
if(index +3 <=s.length() &&isValid(s.substring(index,index+3))){
cur += s.substring(index,index+3) + ".";
count++;
if(len - index - 3 <= 3*(4-count))helper(s,index+3,cur,res);
cur = cur.substring(0,cur.length() - 4);
count--;
}
}
//判断是否合法
public boolean isValid(String s){
//01,010是非法的部分
if(s.charAt(0) == '0' && s.length() > 1) return false;
int num = Integer.valueOf(s);
return num >= 0 && num <= 255;
}
https://leetcode-cn.com/problems/restore-ip-addresses ↩︎