题目描述
有效单词 需要满足以下几个条件:
- 至少 包含 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 <= 20
word
由英文大写和小写字母、数字、'@'
、'#'
和 '$'
组成。
解法
方法一:模拟
我们首先判断字符串的长度是否小于 3,如果是则返回 false
。
然后我们遍历字符串,判断每个字符是否是字母或数字,如果不是则返回 false
。否则我们判断该字符是否是元音字母,如果是则将 has_vowel
置为 true
,否则将 has_consonant
置为 true
。
最后,如果 has_vowel
和 has_consonant
都为 true
,则返回 true
,否则返回 false
。
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为字符串的长度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | class Solution:
def isValid(self, word: str) -> bool:
if len(word) < 3:
return False
has_vowel = has_consonant = False
vs = set("aeiouAEIOU")
for c in word:
if not c.isalnum():
return False
if c.isalpha():
if c in vs:
has_vowel = True
else:
has_consonant = True
return has_vowel and has_consonant
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | class Solution {
public boolean isValid(String word) {
if (word.length() < 3) {
return false;
}
boolean hasVowel = false, hasConsonant = false;
boolean[] vs = new boolean[26];
for (char c : "aeiou".toCharArray()) {
vs[c - 'a'] = true;
}
for (char c : word.toCharArray()) {
if (Character.isAlphabetic(c)) {
if (vs[Character.toLowerCase(c) - 'a']) {
hasVowel = true;
} else {
hasConsonant = true;
}
} else if (!Character.isDigit(c)) {
return false;
}
}
return hasVowel && hasConsonant;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | class Solution {
public:
bool isValid(string word) {
if (word.size() < 3) {
return false;
}
bool has_vowel = false, has_consonant = false;
bool vs[26]{};
string vowels = "aeiou";
for (char c : vowels) {
vs[c - 'a'] = true;
}
for (char c : word) {
if (isalpha(c)) {
if (vs[tolower(c) - 'a']) {
has_vowel = true;
} else {
has_consonant = true;
}
} else if (!isdigit(c)) {
return false;
}
}
return has_vowel && has_consonant;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | func isValid(word string) bool {
if len(word) < 3 {
return false
}
hasVowel := false
hasConsonant := false
vs := make([]bool, 26)
for _, c := range "aeiou" {
vs[c-'a'] = true
}
for _, c := range word {
if unicode.IsLetter(c) {
if vs[unicode.ToLower(c)-'a'] {
hasVowel = true
} else {
hasConsonant = true
}
} else if !unicode.IsDigit(c) {
return false
}
}
return hasVowel && hasConsonant
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | function isValid(word: string): boolean {
if (word.length < 3) {
return false;
}
let hasVowel: boolean = false;
let hasConsonant: boolean = false;
const vowels: Set<string> = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']);
for (const c of word) {
if (!c.match(/[a-zA-Z0-9]/)) {
return false;
}
if (/[a-zA-Z]/.test(c)) {
if (vowels.has(c)) {
hasVowel = true;
} else {
hasConsonant = true;
}
}
}
return hasVowel && hasConsonant;
}
|