算法题-字符串3.21

验证IP地址 算法题-字符串3.21
文章图片

分治
strings.Split(string,byte)//字符串的拆分
对于 IPv4 地址,通过界定符 . 将地址分为四块;对于 IPv6 地址,通过界定符 : 将地址分为八块。
对于 IPv4 地址的每一块,检查它们是否在 0 - 255 内,且没有前置零。
对于 IPv6 地址的每一块,检查其长度是否为 1 - 4 位的十六进制数。

func validIPAddress(IP string) string { if validIPv4Address(IP) { return "IPv4" } if validIPv6Address(IP) { return "IPv6" } return "Neither" }func validIPv4Address(IP string) bool { strArr := strings.Split(IP, ".") if len(strArr) != 4 { return false } for _, str := range strArr { num, err := strconv.Atoi(str) if err != nil || num > 255 || num < 0 { //注意:err != nil return false } newStr := fmt.Sprint(num) if str != newStr { return false } } return true }func validIPv6Address(IP string) bool { strArr := strings.Split(IP, ":") if len(strArr) != 8 { return false } for _, str := range strArr { if len(str) == 0 || len(str) > 4 { return false } for i := 0; i < len(str); i++ { if !(str[i] >= '0' && str[i] <= '9') && !(str[i] >= 'a' && str[i] <= 'f') && !(str[i] >= 'A' && str[i] <= 'F') { return false } } } return true }

正则
需二刷
func validIPAddress(IP string) string { if validIPv4Address(IP) { return "IPv4" } if validIPv6Address(IP) { return "IPv6" } return "Neither" }func validIPv4Address(IP string) bool { strArr := strings.Split(IP, ".") if len(strArr) != 4 { return false } for _, str := range strArr { if num, err := strconv.Atoi(str); err != nil || num > 255 || num < 0 { return false } else if strconv.Itoa(num) != str { return false } } return true } func validIPv6Address(IP string) bool { strArr := strings.Split(IP, ":") if len(strArr) != 8 { return false } re := regexp.MustCompile(`^([0-9]|[a-f]|[A-F])+$`) for _, str := range strArr { if len(str) == 0 || len(str) > 4 { return false } if !re.MatchString(str) { return false } } return true }作者:xilepeng 链接:https://leetcode-cn.com/problems/validate-ip-address/solution/go-jian-dan-jie-fa-zheng-ze-jie-fa-by-xi-pdgj/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

库函数
net.ParseIP()
由于库函数没有判断前导零,我们需要加入判断语句
func validIPAddress(queryIP string) string { ip := net.ParseIP(queryIP) if ip == nil { return "Neither" } if ip.To4() != nil { for _, s := range strings.Split(queryIP, ".") { if len(s) > 1 && s[0] == '0' { return "Neither" } } return "IPv4" } for _, s := range strings.Split(queryIP, ":") { if len(s) > 4 || s == "" { return "Neither" } } return "IPv6" }

最长公共前缀 【算法题-字符串3.21】算法题-字符串3.21
文章图片

纵向扫描/横向扫描
算法题-字符串3.21
文章图片

算法题-字符串3.21
文章图片

纵向:
https://segmentfault.com/a/11...
一个有趣的解法
算法题-字符串3.21
文章图片

字符串解码 算法题-字符串3.21
文章图片

参考官解,有辅助栈与LL1文法两种解法
https://leetcode-cn.com/probl...
使用栈的解法可以参考
https://leetcode-cn.com/probl...
比起官解更优秀

    推荐阅读