LeetCode 93. Restore IP Addresses (复原 IP 地址)
题目
链接
https://leetcode.cn/problems/restore-ip-addresses/
问题描述
有效 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 中的任何数字。你可以按 任何 顺序返回答案。
示例
输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]
提示
1 <= s.length <= 20
s 仅由数字组成
思路
回溯加剪枝,如果当前选取的不对,就没必要继续往后了,直接return即可。
复杂度分析
时间复杂度 O(n2)
空间复杂度 O(n)
代码
Java
LinkedList<String> path = new LinkedList<>();
List<String> ans = new LinkedList<>();
public List<String> restoreIpAddresses(String s) {
trace(s, 0);
return ans;
}
public void trace(String s, int index) {
if (index == s.length() && path.size() == 4) {
String tmp = path.get(0) + "." + path.get(1) + "." + path.get(2) + "." + path.get(3);
ans.add(tmp);
return;
}
for (int i = index + 1; i <= s.length(); i++) {
String tmp = s.substring(index, i);
if (test(tmp)) {
path.add(tmp);
trace(s, i);
path.removeLast();
} else {
return;
}
}
}
public boolean test(String s) {
if (s.length() == 0) {
return false;
}
if (s.charAt(0) == '0' && !s.equals("0")) {
return false;
}
int num = Integer.valueOf(s);
if (num < 0 || num > 255) {
return false;
}
return true;
}