93. 复原 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 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你不能重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/restore-ip-addresses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
class Solution {
private List<String> ret;
private LinkedList<Integer> path;
private void addToRet() {
StringBuilder sb = new StringBuilder();
for (Integer item : path) {
sb.append(item).append(".");
}
ret.add(sb.deleteCharAt(sb.length() - 1).toString());
}
private void solve(String s, int index) {
if (index == s.length()) {
if (path.size() == 4) {
addToRet();
}
return;
}
if (path.size() == 4) {
return;
}
int num = 0;
for (int i = index; i < s.length(); ++i) {
num = num * 10 + s.charAt(i) - '0';
if (num >= 0 && num <= 255) {
path.offerLast(num);
solve(s, i + 1);
path.pollLast();
if (num == 0) {
break;
}
} else {
break;
}
}
}
public List<String> restoreIpAddresses(String s) {
this.ret = new ArrayList<>();
this.path = new LinkedList<>();
solve(s, 0);
return this.ret;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
new Solution().restoreIpAddresses(in.next()).forEach(System.out::println);
}
}
}
心之所向,素履以往 生如逆旅,一苇以航