package main func isValidPart(part string) bool { switch len(part) { case 1: // \d return true case 2: // [^0]\d return part[0] != '0' case 3: // 1\d{2} || 2[0-4]\d || 25[1-5] if part[0] != '2' { return part[0] == '1' } return part[1] <= '4' || (part[1] == '5' && part[2] <= '5') } return false } func restoreIpAddresses(s string) []string { result := []string{} strLen := len(s) if strLen < 4 || 12 < strLen { return result } for i := 1; i < 4 && i < strLen-2; i++ { for j := i + 1; j < i+4 && j < strLen-1; j++ { for k := j + 1; k < j+4 && k < strLen; k++ { if isValidPart(s[0:i]) && isValidPart(s[i:j]) && isValidPart(s[j:k]) && isValidPart(s[k:]) { result = append(result, s[0:i]+"."+s[i:j]+"."+s[j:k]+"."+s[k:]) } } } } return result } // func main() { // fmt.Println(restoreIpAddresses("25525511135")) // fmt.Println(restoreIpAddresses("0000")) // fmt.Println(restoreIpAddresses("00000")) // }