算法:回溯十四 Restore IP Addresses数字字符串还原为IP地址(2种解法)

题目

地址:https://leetcode.com/problems/restore-ip-addresses/

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

Example:

Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]

DFS回溯算法

思路解析:

  1. IP分为4个部分,每个部分的范围为[0, 255]. 所以每个部分的判断逻辑分为如果第一位是0,那么长度只能为1;如果每个部分长度等于3,则校验数据不大于255.if ((part.startsWith("0") && part.length() > 1) || (i == 3 && Integer.valueOf(part) > 255))
  2. 每部分的长度范围为[1, 3], 所以每个部分都有这个范围的循环。
  3. 合格终止条件,如果4个部分集齐,并且开始位置等于字符串的长度,则添加到结果列表。
  4. 异常终止条件,如果4个部分集齐,但是开始位置不等于字符串长度,则退出;
    或者如果4个部分未集齐,但是开始位置已经大于等于字符串长度,则退出。
package backtracking;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

// https://leetcode.com/problems/restore-ip-addresses/
public class RestoreIPAddress {

  public static void main(String[] args) {
    RestoreIPAddress obj = new RestoreIPAddress();
    String s = "25525511135";
    List<String> resultList = obj.restoreIpAddresses(s);
    System.out.println(Arrays.toString(resultList.toArray()));
  }

  public List<String> restoreIpAddresses(String s) {
    List<String> resultList = new ArrayList<String>();
    if (s == null || s.length() < 4) {
      return resultList;
    }

    // DFS
    dfs(resultList, s, 0, "", 0);

    return resultList;
  }

  private void dfs(List<String> resultList, String s, int start, String stored, int count) {
    //exit
    if (start == s.length() && count == 4) {
        resultList.add(stored);
    }

    if (start >= s.length() || count == 4) {
      return;
    }

    for (int i = 1; i < 4; i++) {
      if (start + i > s.length()) {
        break;
      }
      String part = s.substring(start, start + i);
      if ((part.startsWith("0") && part.length() > 1) || (i == 3 && Integer.valueOf(part) > 255)) {
        continue;
      }
      dfs(resultList, s, start + i, stored + part + (count == 3 ? "" : "."), count + 1);
    }
  }
}

顺序遍历解法

思路解析:

  1. 挨个部分组装数据,并且每个部分的起点就是上一部分的终点;
  2. 验证每个部分是否符合规则,如果都符合,则添加到结果列表中。
public List<String> restoreIpAddressesWithIterate(String s) {
  List<String> resultList = new ArrayList<String>();
  if (s == null || s.length() < 4) {
    return resultList;
  }

  int len = s.length();
  String splitS = ".";
  // iterate
  for (int fisrt = 1; fisrt < 4 && fisrt < len - 2; fisrt++) {
    for (int second = fisrt + 1; second < fisrt + 4 && second < len - 1; second++) {
      for (int third = second + 1; third < second + 4 && third < len; third++) {
        String part1 = s.substring(0, fisrt);
        String part2 = s.substring(fisrt, second);
        String part3 = s.substring(second, third);
        String part4 = s.substring(third);
        if (valideIP(part1) && valideIP(part2) && valideIP(part3) && valideIP(part4)) {
          String result = part1 + splitS + part2 + splitS + part3 + splitS + part4;
          resultList.add(result);
        }
      }
    }

  }

  return resultList;
}

private Boolean valideIP(String part) {
  if (part.length() == 0 || part.length() > 3
      || (part.startsWith("0") && part.length() != 1)
      || (part.length() == 3 && Integer.valueOf(part) > 255 )) {
    return false;
  }

  return true;
}

下载

https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/backtracking/RestoreIPAddress.java

你可能感兴趣的:(算法)