验证IP地址
文章图片
分治
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】
文章图片
纵向扫描/横向扫描
文章图片
文章图片
纵向:
https://segmentfault.com/a/11...
一个有趣的解法
文章图片
字符串解码
文章图片
参考官解,有辅助栈与LL1文法两种解法
https://leetcode-cn.com/probl...
使用栈的解法可以参考
https://leetcode-cn.com/probl...
比起官解更优秀
推荐阅读
- LeetCode编程题解法汇总|力扣解法汇总393- UTF-8
- LeetCode编程题解法汇总|力扣解法汇总653-两数之和 IV - 输入 BST
- 排序算法|JS优化版(二叉搜索树第k大节点)
- 算法题-字符串3.20
- 数据结构(C语言实现)|数据结构和算法复杂度简述
- LeetCode编程题解法汇总|力扣解法汇总2039-网络空闲的时刻
- java|LeetCode(561. Array Partition(数组分割))
- leetcode|leetcode:词典中最长的单词
- LeetCode|LeetCode 432. 全 O(1) 的数据结构(双向链表+哈希表) / 720. 词典中最长的单词 / 2043. 简易银行系统