示例 1:
输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]
示例 2:
输入:s = "0000"
输出:["0.0.0.0"]
示例 3:
输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
- class Solution {
- static final int SEG_COUNT = 4;
- List
ans = new ArrayList(); - int[] segments = new int[SEG_COUNT];
-
- public List
restoreIpAddresses(String s) { - segments = new int[SEG_COUNT];
- dfs(s, 0, 0);
- return ans;
- }
-
- public void dfs(String s, int segId, int segStart) {
- // 如果找到了 4 段 IP 地址并且遍历完了字符串,那么就是一种答案
- if (segId == SEG_COUNT) {
- if (segStart == s.length()) {
- StringBuffer ipAddr = new StringBuffer();
- for (int i = 0; i < SEG_COUNT; ++i) {
- ipAddr.append(segments[i]);
- if (i != SEG_COUNT - 1) {
- ipAddr.append('.');
- }
- }
- ans.add(ipAddr.toString());
- }
- return;
- }
-
- // 如果还没有找到 4 段 IP 地址就已经遍历完了字符串,那么提前回溯
- if (segStart == s.length()) {
- return;
- }
-
- // 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0
- if (s.charAt(segStart) == '0') {
- segments[segId] = 0;
- dfs(s, segId + 1, segStart + 1);
- }
-
- // 一般情况,枚举每一种可能性并递归
- int addr = 0;
- for (int segEnd = segStart; segEnd < s.length(); ++segEnd) {
- addr = addr * 10 + (s.charAt(segEnd) - '0');
- if (addr > 0 && addr <= 0xFF) {
- segments[segId] = addr;
- dfs(s, segId + 1, segEnd + 1);
- } else {
- break;
- }
- }
- }
- }