题意:

image.png

解题思路:

  1. 思路:
  2. 1. 长度不能大于12
  3. 2. 每次取s中的1-3位,递归下去,每一个节点下面再取1-3位;
  4. 3. 根据1-3位来判断是否是合理的ip段;
  5. 4. 因为3个点最多可以分成4ip子段,所以三叉树最多4层,这也是递归的终止条件;

图示:

WeChat0b40d2e2debdc1560845b2b14bfe95f0.png

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param String $s
  4. * @return String[]
  5. */
  6. public $res = [];
  7. function restoreIpAddresses($s) {
  8. if (strlen($s) > 12) return [];
  9. $this->restore($s, 4, "");
  10. return $this->res;
  11. }
  12. function restore($s, $k, $ipString) {
  13. if ($k == 0 && strlen($s) == 0) {
  14. //去掉最后一个.
  15. $str = substr($ipString, 0, strlen($ipString) - 1);
  16. array_push($this->res, $str);
  17. return;
  18. }
  19. for ($i = 1; $i <= 3; $i++) {
  20. if (strlen($s) < $i || !$this->valid(substr($s, 0, $i))) {
  21. continue;
  22. }
  23. $this->restore(substr($s, $i), $k - 1, $ipString. substr($s, 0, $i). '.');
  24. }
  25. }
  26. function valid($s) {
  27. if ($s == "" || (strlen($s) > 1 && $s[0] == "0")) return false;
  28. return $s >= 0 && $s <= 255;
  29. }
  30. }

GO代码实现:

  1. func restoreIpAddresses(s string) []string {
  2. res := []string{}
  3. if len(s) > 12 {
  4. return nil
  5. }
  6. dfs(s, "", &res, 4)
  7. return res
  8. }
  9. func dfs(s string, tmp string, res *[]string, k int) {
  10. if k == 0 && len(s) == 0 {
  11. *res = append(*res, tmp[:len(tmp)-1])
  12. }
  13. for i := 1; i <= 3; i++ { //分别取s中的1-3位
  14. if len(s) < i { //超出3位长度
  15. continue
  16. }
  17. str := s[:i]
  18. if !valid(str) {
  19. continue
  20. }
  21. dfs(s[i:], tmp+str+".", res, k - 1)
  22. }
  23. }
  24. func valid(s string) bool {
  25. if len(s) > 1 && s[0] == '0' {
  26. return false
  27. }
  28. v, err := strconv.Atoi(s)
  29. if err != nil {
  30. return false
  31. }
  32. return v >= 0 && v <= 255
  33. }