Skip to main content
Back to problems
#468
Medium Algorithms

Validate ip address

String
28.2% acceptance
Jan 13, 2026
1120
2745
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 while "192.168.01.1", "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, lowercase English letter ('a' to 'f') and upper-case English letters ('A' to 'F'). Leading zeros are allowed in xi. For example, "2001:0db8:85a3:0000:0000:8a2e:0370:7334" and "2001:db8:85a3:0:0:8A2E:0370:7334" are valid IPv6 addresses, while "2001:0db8:85a3::8A2E:037j:7334" and "02001:0db8:85a3:0000:0000:8a2e:0370:7334" are invalid IPv6 addresses.

Solution

Rust
Time O(2^n)
Space O(n)
LeetCode
solution.rs
impl Solution {
  pub fn valid_ip_address(query_ip: String) -> String {
    if Self::is_valid_ipv4(&query_ip) {
      "IPv4".to_string()
    } else if Self::is_valid_ipv6(&query_ip) {
      "IPv6".to_string()
    } else {
      "Neither".to_string()
    }
  }

  fn is_valid_ipv4(ip: &str) -> bool {
    let parts: Vec<&str> = ip.split('.').collect();
    if parts.len() != 4 {
      return false;
    }

    for part in parts {
      if part.is_empty() || part.len() > 3 {
        return false;
      }

      if part.len() > 1 && part.starts_with('0') {
        return false;
      }

      if !part.chars().all(|c| c.is_ascii_digit()) {
        return false;
      }

      if let Ok(num) = part.parse::<i32>() {
        if num > 255 {
          return false;
        }
      } else {
        return false;
      }
    }

    true
  }

  fn is_valid_ipv6(ip: &str) -> bool {
    let parts: Vec<&str> = ip.split(':').collect();
    if parts.len() != 8 {
      return false;
    }

    for part in parts {
      if part.is_empty() || part.len() > 4 {
        return false;
      }

      if !part.chars().all(|c| c.is_ascii_hexdigit()) {
        return false;
      }
    }

    true
  }
}