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 <= 20
  • word 由英文大小写字母、数字、’@’、’#’ 和 ‘$’ 组成。

解题思路

这道题需要检查单词是否满足四个条件,我们可以逐一验证:

解题思路:

  1. 长度检查:首先检查字符串长度是否至少为 3
  2. 字符有效性检查:遍历字符串,确保每个字符都是数字或英文字母
  3. 元音字母检查:在遍历过程中记录是否包含元音字母
  4. 辅音字母检查:在遍历过程中记录是否包含辅音字母

具体实现步骤:

  • 定义元音字母集合:‘a’, ’e’, ‘i’, ‘o’, ‘u’(包括大小写)
  • 使用两个布尔变量 hasVowelhasConsonant 来跟踪是否找到元音和辅音
  • 遍历字符串的每个字符:
    • 如果是非法字符(不是数字、字母),直接返回 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)只使用常数额外空间(元音字符集合大小固定)