# Leetcode Validate IP Address problem solution

In this Leetcode Validate IP Address problem solution Given a string queryIP, return "IPv4" if IP is a valid IPv4 address, "IPv6" if IP is a valid IPv6 address or "Neither" if IP is not a correct IP of any type.

A valid IPv4 address is an IP in the form "x1.x2.x3.x4" where 0 <= xi <= 255 and xi cannot contain leading zeros. For example, "192.168.1.1" and "192.168.1.0" are valid IPv4 addresses but "192.168.01.1", while "192.168.1.00" and "192.168@1.1" are invalid IPv4 addresses.

A valid IPv6 address is an IP in the form "x1:x2:x3:x4:x5:x6:x7:x8" where:

1 <= xi.length <= 4

xi is a hexadecimal string which may contain digits, lower-case English letter ('a' to 'f') and upper-case English letters ('A' to 'F').

Leading zeros are allowed in xi.

## Problem solution in Python.

```class Solution:
ip4, ip6 = IP.split("."), IP.split(":")
if len(ip4) == 4:
for num in ip4:
try:
if not (num[0] in string.digits and int(num) < 256 and (num[0] != "0" or num == "0")): return "Neither"
except: return "Neither"
return "IPv4"
elif len(ip6) == 8:
for num in ip6:
try:
if not (num[0] in string.hexdigits and 0 <= int(num, 16) and len(num) <= 4): return "Neither"
except: return "Neither"
return "IPv6"
return "Neither"
```

## Problem solution in Java.

```public String validIPAddress(String IP) {
if(IP == null || IP.length() == 0) return "Neither";
if(isValidIPv4(IP)) return "IPv4";
if(isValidIPv6(IP)) return "IPv6";
return "Neither";
}
public boolean isValidIPv4(String IP){
String[] input = IP.split("\\.");
//1.1 or 1.1.1.1.
if(input.length != 4 || IP.charAt(IP.length() - 1) == '.') return false;
for(String s : input){
if(s.length() == 0 || s.length() >= 4) return false;
for(char c : s.toCharArray()){
if(c < '0' || c > '9') return false;
}
if(s.charAt(0) == '0' && s.length() > 1) return false;
if(Integer.valueOf(s) > 255) return false;
}
return true;
}
public boolean isValidIPv6(String IP){
String[] input = IP.split(":");
if(input.length != 8 || IP.charAt(IP.length() - 1) == ':') return false;
for(String s : input){
if(s.length() == 0 || s.length() > 4) return false;
for(char c : s.toCharArray()){
//0-9 A-F a-f
if((c - '0' >= 0 && c - '9' <= 0) || (c - 'a' >= 0 && c - 'f' <= 0) || (c - 'A' >= 0 && c - 'F' <= 0)) continue;
return false;
}
}
return true;
}
```

## Problem solution in C++.

```string validIPAddress(string IP) {
stringstream ss(IP);
string       item;
char         ipv4Delim = '.';
char         ipv6Delim = ':';

if (count(begin(IP), end(IP), ipv4Delim) == 3){  // 3 dot's in ip v4
while(getline(ss, item, ipv4Delim)){
for (auto d:item) if (!isdigit(d)) return "Neither";
if (item.empty() || item.length() > 3)                  return "Neither"; // checking empty```
`                 auto val = std::stoi(item);                           `
```                 if (to_string(val).length() != item.length() || val > 255 || val < 0 ) return "Neither";
}
return IP.back() == '.' ? "Neither":"IPv4";
}
else if (count(begin(IP), end(IP), ipv6Delim) == 7){ // 7 ":" in ipv6
while(getline(ss, item, ipv6Delim)){
for (auto d:item) if (!isxdigit(d)) return "Neither";
if ( item.empty() || item.size() > 4)  return "Neither";
auto hex_val = std::stoi(item, nullptr, 16);
}
return IP.back() == ':' ? "Neither":"IPv6";
}

return "Neither";
}```

## Problem solution in C.

```#include <stdio.h>
#include <ctype.h>
char* IPv4 = "IPv4";
char* IPv6 = "IPv6";
char* None = "Neither";
char* validIPv4(char* IP) {
int cnt = 0; printf("ipv4\n");
while(*IP) {
printf("enter: %c\n", *IP);
if(!isdigit(*IP) || (*IP == '0' && IP[1] != '.')){
return None;
}
int val = 0; cnt++; int scnt = 0;
while(isdigit(*IP)) {
scnt++;
val = val*10 + (int)(*IP++%'0');
}
if(scnt > 3) {
return None;
}
if(*IP != '.' || val > 255)
return (*IP || cnt != 3) ? None : IPv4;
IP++;
}
return None;
}

char* validIPv6(char* IP) {
int cnt = 0;
while(*IP) {
int val = 0; cnt++; int scnt = 0;
printf("enter: %c\n", *IP);
if(*IP == ':') {
return None;
}
while(isxdigit(*IP)) {
scnt++;
val = val*10;
val += (*IP >= '0' && *IP <= '9') ? *IP%'0' : tolower(*IP)%'a'+10;
IP++;
}
if(scnt > 4) {
return None;
}
if(*IP != ':' || val > 65535) {
printf("%d %d %c\n", cnt, val, *IP);
return (cnt != 7 || *IP != 0) ? None : IPv6;
}

IP++;
}
return None;
}

char* validIPAddress(char* IP) {
IPv4 = "IPv4";
IPv6 = "IPv6";
if(*IP == '0')
return None;
int val = 0; int scnt = 0;
while(isxdigit(*IP)) {
if(!isdigit(*IP))
IPv4 = IPv6;
scnt++;
val = val*10 + (*IP >= '0' && *IP <= '9') ? *IP%'0' : tolower(*IP)%'a'+10; IP++;
}

if(*IP == '.' && val <= 255 && IPv6 != IPv4 && scnt < 4)
return validIPv4(++IP);
else
if (*IP == ':' && val <= 65535 && scnt < 5)
return validIPv6(++IP);

return None;
}```