1、解题思路
- 区分 IPv4 和 IPv6:如果字符串包含 .,则可能是 IPv4。如果字符串包含 :,则可能是 IPv6。
- 验证 IPv4:分割字符串为 4 部分,检查每组是否为有效数字(0-255,无前导零)。
- 验证 IPv6:分割字符串为 8 部分,检查每组是否为有效的 16 进制数(1-4 位,允许大小写字母)。
- 返回结果:根据验证结果返回 "IPv4"、"IPv6" 或 "Neither"。
2、代码实现
C++
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
string solve(string IP) {
// write code here
if (isIPv4(IP)) return "IPv4";
if (isIPv6(IP)) return "IPv6";
return "Neither";
}
private:
bool isIPv4(string IP) {
vector<string> parts = split(IP, '.');
if (parts.size() != 4) return false;
for (string part : parts) {
if (part.empty() || part.size() > 3) return false;
if (part.size() > 1 && part[0] == '0') return false; // 前导零
for (char c : part) {
if (!isdigit(c)) return false;
}
int num = stoi(part);
if (num < 0 || num > 255) return false;
}
return true;
}
bool isIPv6(string IP) {
vector<string> parts = split(IP, ':');
if (parts.size() != 8) return false;
for (string part : parts) {
if (part.empty() || part.size() > 4) return false;
for (char c : part) {
if (!isxdigit(c)) return false; // 不是16进制字符
}
}
return true;
}
vector<string> split(string s, char delimiter) {
vector<string> res;
string temp;
for (char c : s) {
if (c == delimiter) {
res.push_back(temp);
temp.clear();
} else {
temp += c;
}
}
res.push_back(temp);
return res;
}
};
Java
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
public String solve (String IP) {
// write code here
if (isIPv4(IP)) return "IPv4";
if (isIPv6(IP)) return "IPv6";
return "Neither";
}
private boolean isIPv4(String IP) {
String[] parts = IP.split("\\.", -1);
if (parts.length != 4) return false;
for (String part : parts) {
if (part.isEmpty() || part.length() > 3) return false;
if (part.length() > 1 && part.charAt(0) == '0') return false;
for (char c : part.toCharArray()) {
if (!Character.isDigit(c)) return false;
}
int num = Integer.parseInt(part);
if (num < 0 || num > 255) return false;
}
return true;
}
private boolean isIPv6(String IP) {
String[] parts = IP.split(":", -1);
if (parts.length != 8) return false;
for (String part : parts) {
if (part.isEmpty() || part.length() > 4) return false;
for (char c : part.toCharArray()) {
if (!Character.isDigit(c) && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) {
return false;
}
}
}
return true;
}
}
Python
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 验证IP地址
# @param IP string字符串 一个IP地址字符串
# @return string字符串
#
class Solution:
def solve(self , IP: str) -> str:
# write code here
if self.isIPv4(IP):
return "IPv4"
if self.isIPv6(IP):
return "IPv6"
return "Neither"
def isIPv4(self, IP: str) -> bool:
parts = IP.split('.')
if len(parts) != 4:
return False
for part in parts:
if not part or len(part) > 3:
return False
if len(part) > 1 and part[0] == '0':
return False
if not part.isdigit():
return False
num = int(part)
if num < 0 or num > 255:
return False
return True
def isIPv6(self, IP: str) -> bool:
parts = IP.split(':')
if len(parts) != 8:
return False
for part in parts:
if not part or len(part) > 4:
return False
for c in part:
if not (c.isdigit() or c.lower() in 'abcdef'):
return False
return True
3、复杂度分析
- 时间复杂度:O(n),其中 n 是字符串长度。每个字符最多被处理一次。
- 空间复杂度:O(n),用于存储分割后的部分。