-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path468.validate-ip-address.py
124 lines (122 loc) · 3.14 KB
/
468.validate-ip-address.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#
# @lc app=leetcode id=468 lang=python
#
# [468] Validate IP Address
#
# https://leetcode.com/problems/validate-ip-address/description/
#
# algorithms
# Medium (21.44%)
# Total Accepted: 29.1K
# Total Submissions: 135.7K
# Testcase Example: '"172.16.254.1"'
#
#
# Write a function to check whether an input string is a valid IPv4 address or
# IPv6 address or neither.
#
#
#
# IPv4 addresses are canonically represented in dot-decimal notation, which
# consists of four decimal numbers, each ranging from 0 to 255, separated by
# dots ("."), e.g.,172.16.254.1;
#
#
#
# Besides, leading zeros in the IPv4 is invalid. For example, the address
# 172.16.254.01 is invalid.
#
#
#
# IPv6 addresses are represented as eight groups of four hexadecimal digits,
# each group representing 16 bits. The groups are separated by colons (":").
# For example, the address 2001:0db8:85a3:0000:0000:8a2e:0370:7334 is a valid
# one. Also, we could omit some leading zeros among four hexadecimal digits and
# some low-case characters in the address to upper-case ones, so
# 2001:db8:85a3:0:0:8A2E:0370:7334 is also a valid IPv6 address(Omit leading
# zeros and using upper cases).
#
#
#
#
# However, we don't replace a consecutive group of zero value with a single
# empty group using two consecutive colons (::) to pursue simplicity. For
# example, 2001:0db8:85a3::8A2E:0370:7334 is an invalid IPv6 address.
#
#
#
# Besides, extra leading zeros in the IPv6 is also invalid. For example, the
# address 02001:0db8:85a3:0000:0000:8a2e:0370:7334 is invalid.
#
#
#
# Note:
# You may assume there is no extra space or special characters in the input
# string.
#
#
# Example 1:
#
# Input: "172.16.254.1"
#
# Output: "IPv4"
#
# Explanation: This is a valid IPv4 address, return "IPv4".
#
#
#
#
# Example 2:
#
# Input: "2001:0db8:85a3:0:0:8A2E:0370:7334"
#
# Output: "IPv6"
#
# Explanation: This is a valid IPv6 address, return "IPv6".
#
#
#
# Example 3:
#
# Input: "256.256.256.256"
#
# Output: "Neither"
#
# Explanation: This is neither a IPv4 address nor a IPv6 address.
#
#
#
class Solution(object):
def validIPAddress(self, IP):
"""
:type IP: str
:rtype: str
"""
if '.' in IP:
nums = IP.split('.')
if len(nums) != 4:
return 'Neither'
for x in nums:
if x=='' or (x[0] == '0' and len(x)>1):
return 'Neither'
if not x.isnumeric() or int(x)>255 or int(x)<0:
return 'Neither'
return 'IPv4'
elif ':' in IP:
if len(IP) > 39:
return 'Neither'
nums = IP.split(':')
if len(nums) != 8:
return 'Neither'
for x_ in nums:
x = x_
if x == '' or len(x)>4:
return 'Neither'
x = '0'*(4-len(x))+x
if not x.isalnum():
return 'Neither'
for ch in x:
if ch.isalpha() and (ch.lower() < 'a' or ch.lower() > 'f'):
return 'Neither'
return 'IPv6'
return 'Neither'