93.复原 IP 地址

105 阅读1分钟

题目:
有效 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
}