题目描述:
有效 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
中的任何数字。你可以按 任何 顺序返回答案。
思路:
将字符串装入StringBuilder中,对sb进行分割,如果满足合法的ip地址则加上'.'
,进行递归。
题解:
csharp
private List<String> res = new ArrayList<>();
private StringBuilder path;
private int count = 0;
public List<String> restoreIpAddresses(String s) {
path = new StringBuilder(s);
backtracking(0);
return res;
}
private void backtracking(int i) {
// 终止条件,逗号的个数等于3
if (count == 3) {
// 判断第四段字符串是否是合法的IP地址
if (isValid(path, i, path.length()-1)) {
res.add(path.toString());
}
return;
}
for (int j = i; j < path.length(); j++) {
// 判断是否是合法的IP地址
if (isValid(path, i, j)) {
// 插入逗号
path.insert(j+1, '.');
// 逗号计数器加一
count++;
// 递归+2 是因为插入了逗号,所以要跳过
backtracking(j+2);
// 回溯
path.deleteCharAt(j+1);
// 逗号计数器减一
count--;
}
}
}
// 判断是否是合法的IP地址
private boolean isValid(StringBuilder s,int left ,int right) {
// 判断长度
if (left > right) {
return false;
}
// 判断是否以0开头
if (s.charAt(left) == '0' && left != right) {
return false;
}
// 判断是否在0-255之间
int num = 0;
for (int i = left; i <= right; i++) {
if (sb.charAt(i) >= '0' && sb.charAt(i) <= '9') {
int temp = sb.charAt(i)-'0';
num = num*10 + temp;
} else {
return false;
}
}
return res >= 0 && res <= 255;
}