n := len(s)
	//ip地址最小为:1.1.1.1
	//最大为255.255.255.255
	if n < 4 || n > 12 {
		return []string{}
	}

	ans := []string{}
	//dfs进行回溯,开始遍历s的索引位置,path就是从这个索引遍历到的合法结果
	var dfs func(start int, path []string)
	dfs = func(start int, path []string) {
		//如果找到了4段ip地址或者s已经遍历完了,就用"."拼接然后返回结果
		if len(path) == 4 && start == n {
			ans = append(ans, strings.Join(path, "."))
			return
		}
		//如果还没有找到4段ip就遍历完了,那么就提前回溯
		if start == n {
			return
		}
		//由于ip地址不能有先导‘0’,所以如果当前数字为0,那么这一段ip地址就只能为0
		if s[start] == '0' {
			dfs(start+1, append(path, "0"))
			return
		}
		//核心,从start开始,再往前走两个(一共三位)
		for i := start; i < n && i <= start+2; i++ {
			s := s[start : i+1]
			//看一下遍历之后得到的s是否合法
			//合法就加入path,去找下一段
			if isValid(s) {
				dfs(i+1, append(path, s))
			}
		}
	}
	//需要的结果就是从0开始递归
	dfs(0, []string{})
	return ans
}

//判断子字符串是否有效
func isValid(str string) bool {
	sum := 0
	for _, c := range str {
		//将字符串转化为数字
		sum = sum*10 + int(c-'0')
	}
	//合法的取值范围是在1到255之间
	return sum <= 255 && sum > 0
}