|
| 1 | +import java.util.ArrayList; |
| 2 | +import java.util.LinkedList; |
| 3 | +import java.util.List; |
| 4 | + |
| 5 | +public class RestoreIPAddresses { |
| 6 | + public List<String> restoreIpAddresses(final String s) { |
| 7 | + final List<String> result = new ArrayList<>(); |
| 8 | + restoreIpAddresses(s, result, new LinkedList<>(), 0); |
| 9 | + return result; |
| 10 | + } |
| 11 | + |
| 12 | + private void restoreIpAddresses(final String s, final List<String> result, LinkedList<Integer> numbers, int index) { |
| 13 | + if (numbers.size() == 4 && index == s.length()) { |
| 14 | + result.add(ipAddressFrom(numbers)); |
| 15 | + return; |
| 16 | + } |
| 17 | + if (numbers.size() >= 4 || index == s.length()) { |
| 18 | + return; |
| 19 | + } |
| 20 | + for (int i = index + 1 ; i <= s.length() ; i++) { |
| 21 | + if (isValidIpAddressInteger(s, index, i)) { |
| 22 | + numbers.add(toNumber(s, index, i)); |
| 23 | + restoreIpAddresses(s, result, numbers, i); |
| 24 | + numbers.removeLast(); |
| 25 | + } else { |
| 26 | + break; |
| 27 | + } |
| 28 | + } |
| 29 | + } |
| 30 | + |
| 31 | + private String ipAddressFrom(LinkedList<Integer> numbers) { |
| 32 | + StringBuilder result = new StringBuilder(); |
| 33 | + for (int number : numbers) { |
| 34 | + result.append(number).append('.'); |
| 35 | + } |
| 36 | + result.deleteCharAt(result.length() - 1); |
| 37 | + return result.toString(); |
| 38 | + } |
| 39 | + |
| 40 | + private boolean isValidIpAddressInteger(String s, int start, int end) { |
| 41 | + if (hasLeadingZeros(s, start, end)) return false; |
| 42 | + return toNumber(s, start, end) < 256; |
| 43 | + } |
| 44 | + |
| 45 | + private boolean hasLeadingZeros(String s, int start, int end) { |
| 46 | + return end - start > 1 && s.charAt(start) == '0'; |
| 47 | + } |
| 48 | + |
| 49 | + private int toNumber(String s, int start, int end) { |
| 50 | + int val = 0; |
| 51 | + for (int index = start ; index < end ; index++) { |
| 52 | + val *= 10; |
| 53 | + val += s.charAt(index) - '0'; |
| 54 | + } |
| 55 | + return val; |
| 56 | + } |
| 57 | +} |
0 commit comments