📚 力扣每日一題–2025.7.15
3135. 有效單詞 (簡單)
大家好!今天我們要來聊聊一道有趣的編程題——有效單詞
📝 題目描述
題目分析 📚
題目要求我們判斷一個字符串是否為有效單詞。有效單詞需要滿足以下幾個條件:
- 至少包含 3 個字符。
- 由數字 0-9 和英文大小寫字母組成。(不必包含所有這類字符,也就是可以全部是英文字母,不包括數字也可以)
- 至少包含一個元音字母。
- 至少包含一個輔音字母。
注意事項 📝
'a'
、'e'
、'i'
、'o'
、'u'
及其大寫形式都屬于元音字母。- 英文中的輔音字母是指那些除元音字母之外的字母。
解題思路 🧠
要解決這個問題,我們需要檢查字符串是否滿足上述所有條件。我們可以使用布爾變量來記錄是否包含元音字母和輔音字母,同時檢查字符串長度和字符合法性。
方法一:布爾變量記錄 📝
我們可以使用布爾變量來記錄是否包含元音字母和輔音字母,同時檢查字符串長度和字符合法性。
步驟 🚀
- 檢查字符串長度是否大于等于 3。
- 遍歷字符串中的每個字符,檢查是否為數字或字母。
- 使用布爾變量記錄是否包含元音字母和輔音字母。
- 最后檢查布爾變量是否都為
true
。
代碼實現 💻
class Solution {public boolean isValid(String word) {// 檢查字符串長度是否大于等于 3if (word.length() < 3) {return false;}boolean hasVowel = false;boolean hasConsonant = false;for (char c : word.toCharArray()) {if (!Character.isDigit(c) && !Character.isLetter(c)) {// 如果包含非法字符,直接返回 falsereturn 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
中的計數是否滿足條件。
代碼實現 💻
import java.util.HashMap;
import java.util.Map;class Solution {public boolean isValid(String word) {// 檢查字符串長度是否大于等于 3if (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 {// 如果包含非法字符,直接返回 falsereturn false;}}// 檢查是否至少包含一個元音字母和一個輔音字母return !vowelCount.isEmpty() && !consonantCount.isEmpty();}private boolean isVowel(char c) {return "AEIOUaeiou".indexOf(c) >= 0;}
}
方法三:正則表達式匹配 🧩
使用正則表達式可以將所有條件檢查合并為一個簡潔的模式匹配操作,使代碼更加緊湊。
步驟 🚀
- 檢查字符串長度是否大于等于 3。
- 使用正則表達式同時驗證:
- 只包含字母和數字
- 至少包含一個元音字母
- 至少包含一個輔音字母
代碼實現 💻
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) 時間復雜度的查找。
- 遍歷字符串檢查字符合法性,并記錄是否包含元音和輔音。
代碼實現 💻
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),元音集合大小固定為常數。
拓展思考 💡
這個問題看似簡單,但在實際開發中卻有很多應用場景,例如:
- 密碼強度驗證(可作為密碼規則之一)
- 表單輸入驗證
- 文本內容過濾
課后練習 📝
嘗試實現一個函數,不僅判斷是否為有效單詞,還能返回具體的錯誤原因,例如:
- 長度不足
- 包含非法字符
- 缺少元音
- 缺少輔音
這樣的函數在實際開發中更具實用價值!
希望今天的講解對你有所幫助,我們明天再見!👋