顺序遍历,正则,2 解法求解《468. 验证IP地址》

例题

468. 验证IP地址

给定一个字符串 queryIP。如果是有效的 IPv4 地址,返回 "IPv4" ;如果是有效的 IPv6 地址,返回 "IPv6" ;如果不是上述类型的 IP 地址,返回 "Neither" 。
有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255 且 xi 不能包含 前导零。例如: “192.168.1.1” 、 “192.168.1.0” 为有效IPv4地址, “192.168.01.1” 为无效IPv4地址; “192.168.1.00” 、 “[email protected]” 为无效IPv4地址。
一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 的IP地址,其中:
1 <= xi.length <= 4
xi 是一个 十六进制字符串 ,可以包含数字、小写英文字母( 'a' 到 'f' )和大写英文字母( 'A' 到 'F' )。
在 xi 中允许前导零。
例如 "2001:0db8:85a3:0000:0000:8a2e:0370:7334" 和 "2001:db8:85a3:0:0:8A2E:0370:7334" 是有效的 IPv6 地址,而 "2001:0db8:85a3::8A2E:037j:7334" 和 "02001:0db8:85a3:0000:0000:8a2e:0370:7334" 是无效的 IPv6 地址。
示例 1:
输入:queryIP = "172.16.254.1"
输出:"IPv4"
解释:有效的 IPv4 地址,返回 "IPv4"

答案

顺序遍历

var validIPAddress = function(queryIP) {
  const n = queryIP.length, isIPv4  = queryIP.includes('.')
  let x = 0
  for (let i = 0, s = ''; i <= n; i++) {
    const c = queryIP[i]
    if (i === n || isIPv4 && c === '.' || c === ':') {
      if (s === '' || isIPv4 && s > 255 || s.length > 4) return 'Neither'
      x++
      s = ''
    } else if (c >= 0 && c <= 9 || isIPv4 === false && (c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F')) {
      if (isIPv4 && s === '0' || s.length === 4) return 'Neither'
      s += c
    } else return 'Neither'
  }
  return x === 4 ? 'IPv4' : x === 8 ? 'IPv6' : 'Neither'
};
function validIPAddress(queryIP: string): string {
  const n = queryIP.length, isIPv4 = queryIP.includes('.')
  let x = 0
  for (let i = 0, s = ''; i <= n; i++) {
    const c = queryIP[i]
    if (i === n || isIPv4 && c === '.' || c === ':') {
      if (s === '' || isIPv4 && s > '255' || s.length > 4) return 'Neither'
      x++
      s = ''
    } else if (c >= '0' && c <= '9' || isIPv4 === false && (c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F')) {
      if (isIPv4 && s === '0' || s.length === 4) return 'Neither'
      s += c
    } else return 'Neither'
  }
  return x === 4 ? 'IPv4' : x === 8 ? 'IPv6' : 'Neither'
};
class Solution {
  function validIPAddress($queryIP) {
    $n = strlen($queryIP);
    $isIPv4 = strpos($queryIP, '.') > 0;
    $x = 0;
    $s = '';
    for ($i = 0; $i <= $n; $i++) {
      $c = $queryIP[$i];
      if ($i === $n || $isIPv4 && $c === '.' || $c === ':') {
        if ($s === '' || $isIPv4 && $s > 255 || strlen($s) > 4) return 'Neither';
        $x++;
        $s = '';
      } else if ($c >= 0 && $c <= 9 || $isIPv4 === false && ($c >= 'a' && $c <= 'f' || $c >= 'A' && $c <= 'F')) {
        if ($isIPv4 && $s === '0' || strlen($s) === 4) return 'Neither';
        $s .= $c;
      } else return 'Neither';
    }
    return $x === 4 ? 'IPv4' : ($x === 8 ? 'IPv6' : 'Neither');
  }
}
func validIPAddress(queryIP string) string {
  n, isIPv4, x, s := len(queryIP), strings.Contains(queryIP, "."), 0, &strings.Builder{}
  for i := 0; i <= n; i++ {
    if i == n || isIPv4 && queryIP[i] == '.' || queryIP[i] == ':' {
      if s.Len() == 0 || isIPv4 && s.String() > "255" || s.Len() > 4 {
        return "Neither"
      }
      x++
      s.Reset()
    } else if queryIP[i] >= '0' && queryIP[i] <= '9' || isIPv4 == false && (queryIP[i] >= 'a' && queryIP[i] <= 'f' || queryIP[i] >= 'A' && queryIP[i] <= 'F') {
      if isIPv4 && s.String() == "0" || s.Len() == 4 {
        return "Neither"
      }
      s.WriteByte(queryIP[i])
    } else {
      return "Neither"
    }
  }
  if x == 4 {
    return "IPv4" 
  } else if x == 8 {
    return "IPv6"
  } else {
    return "Neither"
  }
}
class Solution:
  def validIPAddress(self, queryIP: str) -> str:
    n, isIPv4, x, s = len(queryIP), '.' in queryIP, 0, ''
    for i in range(0, n + 1):
      c = '' if i == n else queryIP[i]
      if i == n or isIPv4 and c == '.' or c == ':':
        if s == '' or isIPv4 and s > '255' or len(s) > 4: return 'Neither'
        x += 1
        s = ''
      elif c >= '0' and c <= '9' or isIPv4 == False and (c >= 'a' and c <= 'f' or c >= 'A' and c <= 'F'):
        if isIPv4 and s == '0' or len(s) == 4: return 'Neither'
        s += c
      else: return 'Neither'
    if x == 4: return 'IPv4'
    if x == 8: return 'IPv6'
    return 'Neither'
class Solution {
  public String validIPAddress(String queryIP) {
    int n = queryIP.length();
    boolean isIPv4 = queryIP.contains(".");
    String s = "";
    int x = 0;
    for (int i = 0; i <= n; i++) {
      char c = i == n ? Character.MIN_VALUE : queryIP.charAt(i);
      if (i == n || isIPv4 && c == '.' || c == ':') {
        if (s == "" || isIPv4 && Integer.valueOf(s) > 255 || s.length() > 4) return "Neither";
        x++;
        s = "";
      } else if (c >= '0' && c <= '9' || isIPv4 == false && (c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F')) {
        if (isIPv4 && s.equals("0") == true || s.length() == 4) return "Neither";
        s += c;
      } else return "Neither";
    }
    return x == 4 ? "IPv4" : x == 8 ? "IPv6" : "Neither";
  }
}

正则

var validIPAddress = function(queryIP) {
  return /^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)($|\.(?!$))){4}$/.test(queryIP) ? 'IPv4' : /^([0-9a-fA-F]{1,4}($|:(?!$))){8}$/.test(queryIP) ? 'IPv6' : 'Neither'
};
function validIPAddress(queryIP: string): string {
  return /^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)($|\.(?!$))){4}$/.test(queryIP) ? 'IPv4' : 
         /^([0-9a-fA-F]{1,4}($|:(?!$))){8}$/.test(queryIP) ? 'IPv6' : 'Neither'
};
class Solution {
  function validIPAddress($queryIP) {
    return preg_match('/^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)($|\.(?!$))){4}$/', $queryIP) > 0 ? 'IPv4' : (
      preg_match('/^([0-9a-fA-F]{1,4}($|:(?!$))){8}$/', $queryIP) > 0 ? 'IPv6' : 'Neither'
    );
  }
}
class Solution:
  def validIPAddress(self, queryIP: str) -> str:
    if re.match('^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)($|\.(?!$))){4}$', queryIP): return 'IPv4'
    if re.match('^([0-9a-fA-F]{1,4}($|:(?!$))){8}$', queryIP): return 'IPv6'
    return 'Neither'
class Solution {
  public String validIPAddress(String queryIP) {
    return queryIP.matches("^((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)($|\\.(?!$))){4}$") ? "IPv4" : queryIP.matches("^([0-9a-fA-F]{1,4}($|:(?!$))){8}$") ? "IPv6" : "Neither";
  }
}

双哈希表:求解《890. 查找和替换模式》
双哈希表,求解《890. 查找和替换模式》
动态规划:求解《926. 将字符串翻转到单调递增》
动态规划,求解《926. 将字符串翻转到单调递增》
字符串操作、正则(零宽断言):2种方法求解《929. 独特的电子邮件地址》
字符串操作、正则(零宽断言),2种方法求解《929. 独特的电子邮件地址》