- 题目描述
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是"0.011.255.245"、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。
提示:
- 0 <= s.length <= 3000
- s 仅由数字组成
- 示例
示例 1:
输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]
示例 2:
输入:s = “0000”
输出:[“0.0.0.0”]
示例 3:
输入:s = “1111”
输出:[“1.1.1.1”]
示例 4:
输入:s = “010010”
输出:[“0.10.0.10”,“0.100.1.0”]
示例 5:
输入:s = “101023”
输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]
- 思路分析
考虑所有分隔情况,需要注意一下几点:
- 如果s开头是0,那么这个0就必须单独作为一部分,因为题目规定没有前导0
- 以已经分成的部分数空值深度:当已经有了四部分后,判断是否还有剩余的部分,就可以知道是否是一个符合的分割
- 如果剩余字符串长度>3,那么共有三种分法;如果长度<3,那么分法 = 长度。
- JAVA实现
class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> res = new ArrayList();
if(s.length() < 4 || s.length() > 12) return res;
String temp = "";
analysis(s, temp, 0, res);
return res;
}
public void analysis(String s, String temp, int part, List<String> res) {
//part:前面的字符串已经组成了几部分
//if part == 4 && s.length ==0 add;
// else return;
//part<4;
if(part == 4) {
if(s.length() == 0) res.add(temp.substring(0,temp.length()-1));
return;
}
if(s.length() == 0) return;
if(s.substring(0,1).equals("0")) {
analysis(s.substring(1,s.length()), temp+"0.", part+1, res);
return;
}
int num = Math.min(s.length(), 3);
for(int i=1;i<=num; i++) {
int remains = Integer.parseInt(s.substring(0,i));
if(remains >= 0 && remains <= 255) {
String next = temp + remains;
next += ".";
String newS = s.substring(i, s.length());
analysis(s.substring(i, s.length()), temp + remains + ".", part+1, res);
}
else return;
}
}
}