题目:
有效 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 地址。
给定一个只包含数字的字符串 s
,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s
中插入 '.'
来形成。你 不能 重新排序或删除 s
中的任何数字。你可以按 任何 顺序返回答案。
方法一:暴力解,在遇到面试的时候可以直接四层循环暴力解,代码如下,可以解决但不建议:
import java.util.ArrayList;
import java.util.List;
/**
* 输入:s = "25525511135"
* 输出:["255.255.11.135","255.255.111.35"]
*/
public class no_93 {
public static void main(String[] args) {
String s = "25525511135";
List<String> re = restoreIpAddresses(s);
for (String p : re) {
System.out.println(p);
}
}
public static List<String> restoreIpAddresses(String s) {
List<String> re = new ArrayList<>();
for (int i = 1; i < 4; i++) {
for (int j = 1; j < 4; j++) {
for (int k = 1; k < 4; k++) {
for (int l = 1; l < 4; l++) {
if (i + j + k + l == s.length()) {
String s1 = s.substring(0, i);
String s2 = s.substring(i, i + j);
String s3 = s.substring(i + j, i + j + k);
String s4 = s.substring(i + j + k, i + j + k + l);
if (ifReasonable(s1) && ifReasonable(s2) && ifReasonable(s3) && ifReasonable(s4))
re.add(s1 + '.' + s2 + '.' + s3 + '.' + s4);
}
}
}
}
}
return re;
}
public static boolean ifReasonable(String s) {
if (Integer.parseInt(s) < 256) {
// ip地址必须小于等于255
// 根据题意,首位为0只在ip地址的开头满足
return s.charAt(0) != '0' || s.charAt(0) == '0' && s.length() == 1;
}
return false;
}
}
方法二:回溯