📚 力扣每日一题--2025.7.15
3135. 有效单词 (简单)
大家好!今天我们要来聊聊一道有趣的编程题------有效单词
📝 题目描述


题目分析 📚
题目要求我们判断一个字符串是否为有效单词。有效单词需要满足以下几个条件:
- 至少包含 3 个字符。
- 由数字 0-9 和英文大小写字母组成。(不必包含所有这类字符,也就是可以全部是英文字母,不包括数字也可以)
- 至少包含一个元音字母。
- 至少包含一个辅音字母。
注意事项 📝
'a'
、'e'
、'i'
、'o'
、'u'
及其大写形式都属于元音字母。- 英文中的辅音字母是指那些除元音字母之外的字母。
解题思路 🧠
要解决这个问题,我们需要检查字符串是否满足上述所有条件。我们可以使用布尔变量来记录是否包含元音字母和辅音字母,同时检查字符串长度和字符合法性。
方法一:布尔变量记录 📝
我们可以使用布尔变量来记录是否包含元音字母和辅音字母,同时检查字符串长度和字符合法性。
步骤 🚀
- 检查字符串长度是否大于等于 3。
- 遍历字符串中的每个字符,检查是否为数字或字母。
- 使用布尔变量记录是否包含元音字母和辅音字母。
- 最后检查布尔变量是否都为
true
。
代码实现 💻
java
class Solution {
public boolean isValid(String word) {
// 检查字符串长度是否大于等于 3
if (word.length() < 3) {
return false;
}
boolean hasVowel = false;
boolean hasConsonant = false;
for (char c : word.toCharArray()) {
if (!Character.isDigit(c) && !Character.isLetter(c)) {
// 如果包含非法字符,直接返回 false
return false;
}
if (isVowel(c)) {
hasVowel = true;
} else if (Character.isLetter(c)) {
hasConsonant = true;
}
}
// 检查是否至少包含一个元音字母和一个辅音字母
return hasVowel && hasConsonant;
}
private boolean isVowel(char c) {
return "AEIOUaeiou".indexOf(c) >= 0;
}
}
方法二:使用 Map 记录 📊
我们也可以使用 Map
来记录字符的分类计数,然后检查 Map
中的计数是否满足条件。
步骤 🚀
- 检查字符串长度是否大于等于 3。
- 使用三个
Map
分别存储元音字母、辅音字母和数字的计数。 - 遍历字符串中的每个字符,根据字符类型将其存储在相应的
Map
中。 - 检查
Map
中的计数是否满足条件。
代码实现 💻
java
import java.util.HashMap;
import java.util.Map;
class Solution {
public boolean isValid(String word) {
// 检查字符串长度是否大于等于 3
if (word.length() < 3) {
return false;
}
// 使用 Map 来存储字符的分类计数
Map<Character, Integer> vowelCount = new HashMap<>();
Map<Character, Integer> consonantCount = new HashMap<>();
Map<Character, Integer> digitCount = new HashMap<>();
for (char c : word.toCharArray()) {
if (Character.isDigit(c)) {
digitCount.put(c, digitCount.getOrDefault(c, 0) + 1);
} else if (isVowel(c)) {
vowelCount.put(c, vowelCount.getOrDefault(c, 0) + 1);
} else if (Character.isLetter(c)) {
consonantCount.put(c, consonantCount.getOrDefault(c, 0) + 1);
} else {
// 如果包含非法字符,直接返回 false
return false;
}
}
// 检查是否至少包含一个元音字母和一个辅音字母
return !vowelCount.isEmpty() && !consonantCount.isEmpty();
}
private boolean isVowel(char c) {
return "AEIOUaeiou".indexOf(c) >= 0;
}
}
方法三:正则表达式匹配 🧩
使用正则表达式可以将所有条件检查合并为一个简洁的模式匹配操作,使代码更加紧凑。
步骤 🚀
- 检查字符串长度是否大于等于 3。
- 使用正则表达式同时验证:
- 只包含字母和数字
- 至少包含一个元音字母
- 至少包含一个辅音字母
代码实现 💻
java
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Solution {
private static final Pattern PATTERN = Pattern.compile(
"^(?=.*[AEIOUaeiou])" + // 至少一个元音
"(?=.*[bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ])" + // 至少一个辅音
"[a-zA-Z0-9]{3,}$"
);
public boolean isValid(String word) {
// 使用正则表达式进行所有条件的匹配
Matcher matcher = PATTERN.matcher(word);
return matcher.matches();
}
}
方法四:哈希集合优化元音查找 ⚡
提前定义元音集合,使用哈希表的 O(1) 查找效率来优化元音判断,比字符串的 indexOf 方法更高效。
步骤 🚀
- 检查字符串长度是否大于等于 3。
- 使用哈希集合存储所有元音字母,实现 O(1) 时间复杂度的查找。
- 遍历字符串检查字符合法性,并记录是否包含元音和辅音。
代码实现 💻
java
import java.util.HashSet;
import java.util.Set;
class Solution {
// 提前定义元音集合,使用静态初始化提高效率
private static final Set<Character> VOWELS = new HashSet<>();
static {
VOWELS.add('a'); VOWELS.add('e'); VOWELS.add('i'); VOWELS.add('o'); VOWELS.add('u');
VOWELS.add('A'); VOWELS.add('E'); VOWELS.add('I'); VOWELS.add('O'); VOWELS.add('U');
}
public boolean isValid(String word) {
if (word.length() < 3) {
return false;
}
boolean hasVowel = false;
boolean hasConsonant = false;
for (char c : word.toCharArray()) {
if (!Character.isLetterOrDigit(c)) {
return false;
}
if (VOWELS.contains(c)) {
hasVowel = true;
} else if (Character.isLetter(c)) {
hasConsonant = true;
}
}
return hasVowel && hasConsonant;
}
}
示例表格 📊
让我们来看一些示例:
输入字符串 | 输出结果 | 说明 |
---|---|---|
"abc" | true | 包含元音 a 和辅音 b、c |
"ab" | false | 长度不足 3 个字符 |
"a1b" | true | 包含元音 a、辅音 b 和数字 1 |
"A1" | false | 长度不足且缺少辅音 |
"a!b" | false | 包含非法字符"!" |
"xyz" | false | 只包含辅音,缺少元音 |
"AEiou" | false | 只包含元音,缺少辅音 |
"123abc" | true | 包含数字、元音 a 和辅音 b、c |
复杂度分析 ⚡
方法一:布尔变量记录
- 时间复杂度:O(n),其中 n 是字符串的长度。我们只需遍历一次字符串。
- 空间复杂度:O(1),只使用了固定数量的额外变量。
方法二:使用 Map 记录
- 时间复杂度:O(n),同样只需遍历一次字符串。
- 空间复杂度:O(k),其中 k 是不同字符的数量,最坏情况下为 O(n)。
方法三:正则表达式匹配
- 时间复杂度:O(n),正则表达式匹配需要遍历整个字符串。
- 空间复杂度:O(1),只使用了固定的模式对象。
方法四:哈希集合优化
- 时间复杂度:O(n),只需遍历一次字符串。
- 空间复杂度:O(1),元音集合大小固定为常数。
拓展思考 💡
这个问题看似简单,但在实际开发中却有很多应用场景,例如:
- 密码强度验证(可作为密码规则之一)
- 表单输入验证
- 文本内容过滤
课后练习 📝
尝试实现一个函数,不仅判断是否为有效单词,还能返回具体的错误原因,例如:
- 长度不足
- 包含非法字符
- 缺少元音
- 缺少辅音
这样的函数在实际开发中更具实用价值!
希望今天的讲解对你有所帮助,我们明天再见!👋