Easy
题目描述
如果一个单词满足以下条件,则被认为是有效的:
- 它包含至少 3 个字符。
- 它只包含数字 (0-9) 和英文字母(大写和小写)。
- 它包含至少一个元音字母。
- 它包含至少一个辅音字母。
给你一个字符串 word。
如果 word 有效则返回 true,否则返回 false。
注意:
'a','e','i','o','u'及其大写形式是元音字母。- 辅音字母是不是元音字母的英文字母。
示例 1:
输入:word = "234Adas"
输出:true
解释:这个单词满足所有条件。
示例 2:
输入:word = "b3"
输出:false
解释:这个单词的长度少于 3,并且没有元音字母。
示例 3:
输入:word = "a3$e"
输出:false
解释:这个单词包含 '$' 字符,并且没有辅音字母。
约束条件:
1 <= word.length <= 20word由英文大小写字母、数字、’@’、’#’ 和 ‘$’ 组成。
解题思路
这道题需要检查单词是否满足四个条件,我们可以逐一验证:
解题思路:
- 长度检查:首先检查字符串长度是否至少为 3
- 字符有效性检查:遍历字符串,确保每个字符都是数字或英文字母
- 元音字母检查:在遍历过程中记录是否包含元音字母
- 辅音字母检查:在遍历过程中记录是否包含辅音字母
具体实现步骤:
- 定义元音字母集合:‘a’, ’e’, ‘i’, ‘o’, ‘u’(包括大小写)
- 使用两个布尔变量
hasVowel和hasConsonant来跟踪是否找到元音和辅音 - 遍历字符串的每个字符:
- 如果是非法字符(不是数字、字母),直接返回 false
- 如果是元音字母,标记
hasVowel = true - 如果是辅音字母,标记
hasConsonant = true
- 最后检查所有条件是否都满足
时间复杂度为 O(n),空间复杂度为 O(1),是最优解法。
代码实现
class Solution {
public:
bool isValid(string word) {
if (word.length() < 3) return false;
bool hasVowel = false;
bool hasConsonant = false;
string vowels = "aeiouAEIOU";
for (char c : word) {
if (!isalnum(c)) {
return false;
}
if (isalpha(c)) {
if (vowels.find(c) != string::npos) {
hasVowel = true;
} else {
hasConsonant = true;
}
}
}
return hasVowel && hasConsonant;
}
};
class Solution:
def isValid(self, word: str) -> bool:
if len(word) < 3:
return False
has_vowel = False
has_consonant = False
vowels = set('aeiouAEIOU')
for c in word:
if not c.isalnum():
return False
if c.isalpha():
if c in vowels:
has_vowel = True
else:
has_consonant = True
return has_vowel and has_consonant
public class Solution {
public bool IsValid(string word) {
if (word.Length < 3) return false;
bool hasVowel = false;
bool hasConsonant = false;
string vowels = "aeiouAEIOU";
foreach (char c in word) {
if (!char.IsLetterOrDigit(c)) {
return false;
}
if (char.IsLetter(c)) {
if (vowels.Contains(c)) {
hasVowel = true;
} else {
hasConsonant = true;
}
}
}
return hasVowel && hasConsonant;
}
}
var isValid = function(word) {
if (word.length < 3) return false;
let hasVowel = false;
let hasConsonant = false;
const vowels = new Set('aeiouAEIOU');
for (let c of word) {
if (!/[a-zA-Z0-9]/.test(c)) {
return false;
}
if (/[a-zA-Z]/.test(c)) {
if (vowels.has(c)) {
hasVowel = true;
} else {
hasConsonant = true;
}
}
}
return hasVowel && hasConsonant;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历字符串一次,n为字符串长度 |
| 空间复杂度 | O(1) | 只使用常数额外空间(元音字符集合大小固定) |