题目:
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
- 例如:
"0.1.2.201"和"192.168.1.1"是 有效 IP 地址,但是"0.011.255.245"、"192.168.1.312"和"192.168@1.1"是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
算法:
func restoreIpAddresses(s string) []string {
ans := make([]string, 0)
result := make([]string, 0)
var backtracking func(index, segmentStart, segment int)
backtracking = func(index, segmentStart, segment int) {
if index == len(s) || segment == 4 {
if index == len(s) && segment == 4 {
ans = append(ans, strings.Join(result, "."))
}
return
}
// 以0开头
if s[index] == byte('0') && index == segmentStart {
result = append(result, "0")
backtracking(index+1, index+1, segment+1)
result = result[:len(result)-1]
return
}
for i := index; i < len(s); i++ {
num, _ := strconv.Atoi(s[segmentStart:i+1])
if num > 255 {
break
}
result = append(result, s[segmentStart:i+1])
backtracking(i+1, i+1, segment+1)
result = result[:len(result)-1]
}
}
backtracking(0, 0, 0)
return ans
}