import (
"strconv"
"strings"
)
//判断ip是否合法
func isValid(s string) bool {
if s != "0" && s[0] == '0' {
return false
}
num, _ := strconv.Atoi(s)
if num < 0 || num > 255 {
return false
}
return true
}
93. 复原 IP 地址
func restoreIpAddresses(s string) []string {
result := make([]string, 0)
//一个合法IP最少1*4=4位,最大3*4=12位,超过或小于都不合法
if len(s) > 12 || len(s) < 4 {
return result
}
//存储单次集合
path := make([]string, 0)
var backtrace func(str string, startIndex int)
backtrace = func(str string, startIndex int) {
//path有4个元素就可以构成一个IP
if len(path) == 4 {
if startIndex == len(str) {
ip := strings.Join(path, ".")
result = append(result, ip)
}
return
}
for i := startIndex; i < len(s); i++ {
str1 := s[startIndex : i+1]
if isValid(str1) {
path = append(path, str1) // 符合条件的就进入下一层
backtrace(s, i+1)
//回溯处理
path = path[:len(path)-1]
} else {
break
}
}
}
backtrace(s, 0)
return result
}