【LeetCode 3136. 有效單詞】解析

目錄

  • LeetCode中國站原文
  • 原始題目
    • 題目描述
    • 示例 1:
    • 示例 2:
    • 示例 3:
    • 提示:
  • 講解
  • 化繁為簡:如何優雅地“盤”邏輯判斷題
    • 第一部分:算法思想 —— “清單核對”與“一票否決”
    • 第二部分:代碼實現 —— 清晰的邏輯翻譯
      • 實現一:常規判斷邏輯
      • 實現二:使用正則表達式(一行代碼的“炫技”)
    • 第三部分:總結

LeetCode中國站原文

https://leetcode.cn/problems/valid-word/

原始題目

題目描述

有效單詞 需要滿足以下幾個條件:

  1. 至少 包含 3 個字符。
  2. 由數字 0-9 和英文大小寫字母組成。(不必包含所有這類字符。)
  3. 至少 包含一個 元音字母
  4. 至少 包含一個 輔音字母

給你一個字符串 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

講解

化繁為簡:如何優雅地“盤”邏輯判斷題

大家好!今天我們來解決一道非常適合新手入門的題目:LeetCode 3136. 有效單詞。

這道題沒有炫酷的算法,也不需要復雜的數據結構。它就像一個“邏輯清單”,考驗的是我們如何把一系列規則,清晰、準確地翻譯成代碼。這類問題在實際工作中非常常見,比如校驗用戶輸入的密碼、驗證表單字段等。讓我們來看看如何優雅地完成這項任務。

第一部分:算法思想 —— “清單核對”與“一票否決”

解決這類“多條件判斷”問題,最好的方法就是“清單核對法”。我們可以把題目中的所有要求,想象成一張通關清單,我們的 word 字符串需要逐項檢查,全部打上勾才能通關。

通關清單:

  1. 長度審查word 的長度是否 >= 3
  2. 成分審查word 中的每一個字符,是否都是字母或數字?
  3. 元音指標word 中是否至少有一個元音字母?
  4. 輔音指標word 中是否至少有一個輔音字母?

核心策略:“一票否決制”

在核對清單時,最有效的策略是“一票否決”。只要在檢查過程中發現任何一項不滿足,我們就可以立刻得出結論:這個 word 無效,直接返回 false,后面的檢查就不用再做了。這可以避免不必要的計算。

“一票否決”流程
長度是否 >= 3?
開始
返回 false
遍歷每個字符
當前字符是字母或數字?
是元音?
標記: 已找到元音
是輔音?
標記: 已找到輔音
遍歷結束
是否同時找到了
元音和輔音?
返回 true

這個流程圖清晰地展示了我們的策略:

  1. 先處理硬性條件:首先檢查長度和字符合法性。這兩項是“全局”的,只要有一個字符不滿足,整個單詞就作廢。
  2. 再統計指標:在遍歷檢查字符合法性的同時,我們可以順便完成“元音”和“輔音”的統計任務。用兩個布爾變量 hasVowelhasConsonant 作為標記,一旦找到,就把它設為 true
  3. 最后匯總:所有字符都遍歷完后,如果程序還沒有提前退出,說明長度和成分都合格了。這時,我們只需要檢查 hasVowelhasConsonant 這兩個標記是否都為 true,就能做出最終的裁決。

第二部分:代碼實現 —— 清晰的邏輯翻譯

現在,我們把“清單核對”和“一票否決”的策略翻譯成代碼。

實現一:常規判斷邏輯

這是最直接、最易于理解的實現方式。

class Solution {/*** 校驗一個字符串是否為“有效單詞”。* @param word 待校驗的字符串。* @return 如果有效,返回 true;否則返回 false。*/public boolean isValid(String word) {// 條件1: 長度審查if (word.length() < 3) {return false;}// 準備兩個標記,用于統計元音和輔音指標boolean hasVowel = false;boolean hasConsonant = false;// 開始遍歷,同時進行“成分審查”和“指標統計”for (char ch : word.toCharArray()) {// 條件2: 成分審查if (!Character.isLetterOrDigit(ch)) {return false; // 一票否-決:包含非法字符}// 判斷字符類型,并更新指標if (Character.isLetter(ch)) {if ("aeiouAEIOU".indexOf(ch) != -1) {hasVowel = true; // 找到了元音} else {hasConsonant = true; // 找到了輔音}}}// 最終裁決:檢查兩個核心指標是否都已達成return hasVowel && hasConsonant;}
}

代碼解讀:

  • Character.isLetterOrDigit(ch):Java 內置的函數,非常方便地判斷一個字符是否為字母或數字。
  • "aeiouAEIOU".indexOf(ch) != -1:這是一個判斷元音的小技巧。我們把所有元音字母組成一個字符串,然后檢查當前字符 ch 是否能在這個字符串里找到。如果能找到(indexOf 返回的不是 -1),那它就是元音。

實現二:使用正則表達式(一行代碼的“炫技”)

對于熟悉正則表達式的高手來說,可以用一行代碼解決這個問題。這種方法雖然簡潔,但在性能上通常不如直接遍歷,且可讀性對新手不友好,更適合作為一種思路擴展。

class Solution {public boolean isValid(String word) {// 正則表達式的含義:// (?=.*[aeiouAEIOU])  - 正向先行斷言:字符串中必須存在至少一個元音// (?=.*[bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ]) - 字符串中必須存在至少一個輔音// [a-zA-Z0-9]{3,}     - 字符串本身必須由3個或以上的大小寫字母和數字組成return word.matches("(?i)(?=.*[aeiou])(?=.*[b-df-hj-np-tv-z])[a-z0-9]{3,}");}
}

注:第二種寫法為了簡潔,在輔音的判斷上使用了[b-df-hj-np-tv-z]這種窮舉方式,并使用 (?i) 標志來忽略大小寫。這種寫法主要是為了展示正則表達式的強大能力,在實際面試中,第一種清晰的遍歷寫法通常更受青睞。

第三部分:總結

這道“有效單詞”題,是一次絕佳的編程基本功練習。它告訴我們:

  • 拆解問題:面對一系列復雜規則,首先要把它們拆解成一個個清晰、獨立的小任務。
  • 流程控制:使用“一票否決”可以有效提升代碼效率,避免不必要的計算。
  • 善用工具:熟悉并使用語言內置的函數(如 Character.isLetterOrDigit)可以讓代碼更簡潔、更健壯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89080.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89080.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89080.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端面試專欄-算法篇:24. 算法時間與空間復雜度分析

&#x1f525; 歡迎來到前端面試通關指南專欄&#xff01;從js精講到框架到實戰&#xff0c;漸進系統化學習&#xff0c;堅持解鎖新技能&#xff0c;祝你輕松拿下心儀offer。 前端面試通關指南專欄主頁 前端面試專欄規劃詳情 算法時間與空間復雜度分析&#xff1a;從理論到實踐…

bash中||與的區別

在 Bash 中&#xff0c;|| 和 && 是兩種常用的邏輯操作符&#xff0c;用于控制命令的執行流程。它們的核心區別如下&#xff1a;1. ||&#xff08;邏輯 OR&#xff09; 作用&#xff1a;如果前一個命令失敗&#xff08;返回非零退出碼&#xff09;&#xff0c;則執行后…

OpenCV實現感知哈希(Perceptual Hash)算法的類cv::img_hash::PHash

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 PHash是OpenCV中實現感知哈希&#xff08;Perceptual Hash&#xff09;算法的類。該算法用于快速比較圖像的視覺相似性。它將圖像壓縮為一個簡短的…

數據庫遷移人大金倉數據庫

遷移前的準備工作 安裝官方的kdts和KStudio工具 方案說明 一、數據庫遷移&#xff1a;可以使用kdts進行數據庫的按照先遷移表結構、后數據的順序遷移&#xff08;kdts的使用可以參考官方文檔&#xff09; 其他參考文檔 人大金倉官網&#xff1a;https://download.kingbase…

uniapp 微信小程序Vue3項目使用內置組件movable-area封裝懸浮可拖拽按鈕(拖拽結束時自動吸附到最近的屏幕邊緣)

一、最終效果 二、具體詳情請看movable-area與movable-view官方文檔說明 三、參數配置 1、代碼示例 <TFab title"新建訂單" click"addOrder" /> // title:表按鈕文案 // addOrder:點擊按鈕事件四、組件源碼 <template><movable-area cl…

linux kernel為什么要用IS_ERR()宏來判斷指針合法性?

在 Linux 內核中&#xff0c;IS_ERR() 宏的設計與內核的錯誤處理機制和指針編碼規范密切相關&#xff0c;主要用于判斷一個“可能攜帶錯誤碼的指針”是否代表異常狀態。其核心目的是解決內核中指針返回值與錯誤碼的統一表示問題。以下從技術背景、設計邏輯和實際場景三個維度詳…

Cookie與Session:Web開發核心差異詳解

理解 Cookie 和 Session 的區別對于 Web 開發至關重要,它們雖然經常一起使用,但扮演著不同的角色。核心區別在于: Cookie:存儲在客戶端(用戶的瀏覽器)的數據片段。 Session:存儲在服務器端的數據結構,用于跟蹤特定用戶的狀態。 下面是詳細的對比: 特性CookieSession…

【相干、相參】 雷電名詞溯源

〇、廢話因緣 最近某些國產的微波制造公司總是提到一個概念【相干】【相參】【嚴格相參】等等概念層出不窮&#xff0c;讓人苦惱。 一、這玩意還是英文溯源吧 這幾個概念都聚焦在一個單詞【Coherence】&#xff1b;所以就是說兩個波形之間有某種聯系&#xff0c;不一定就是完全…

MYSQL練習2

一、對mydb11_stu庫進行查詢步驟1.創建mydb11_stu庫并使用2.創建score表和student表3.向兩張表插入數據student表&#xff1a;score表&#xff1a;4.完成查詢&#xff08;1&#xff09;分別查詢student表和score表的所有記錄&#xff08;2&#xff09;查詢student表的第2小到5條…

Spring Boot全局異常處理:打造堅如磐石的應用防線

引言在當今的軟件開發領域&#xff0c;隨著業務的日益復雜和系統規模的不斷擴大&#xff0c;Spring Boot 已成為 Java 開發中備受青睞的框架。它以其強大的功能、便捷的配置和快速的開發體驗&#xff0c;幫助開發者們高效地構建各種應用程序。在 Spring Boot 應用的開發過程中&…

藥品掛網價、藥品集采價格、藥品上市價格一鍵查詢!

相信許多人在查詢藥品價格時感到無從下手&#xff0c;那是因為對藥品定價機制和標準的不了解&#xff0c;醫院及藥店的藥品價格查詢可通過筆者之前的文章進行了解&#xff1a;如何查詢藥品的價格&#xff08;醫院&藥店&鄉鎮衛生院&#xff09;&#xff1f; 而今天筆者要…

【iOS】方法與消息底層分析

目錄 前言 方法的本質 向不同對象發送消息 發送實例方法 發送類方法 對象調用方法 實際執行是父類 向父類發送類方法 消息查找流程 開始查找 快速查找流程 慢速查找流程 動態方法決議 應用場景 優化方案 消息轉發機制 快速轉發流程 應用場景 慢速轉發流程 應…

如何通過 WebSocket 接口訂閱實時外匯行情數據(PHP 示例)

步驟 1&#xff1a;準備工作確保已安裝 PHP 和 Composer安裝 WebSocket 客戶端庫&#xff1a;composer require textalk/websocket步驟 2&#xff1a;編寫代碼訂閱行情以下是最簡可運行的 PHP 示例&#xff0c;訂閱 EUR/USD 的 1分鐘K線數據&#xff1a;<?phprequire vendo…

第十八篇 數據清洗:Python智能篩選與統計:從海量Excel數據中秒級挖掘,輔助決策!你的數據分析利器!

Excel 數據挖掘Excel篩選復雜&#xff0c;統計耗時&#xff0c;無法快速挖掘數據價值1.數據篩選核心&#xff1a;df.loc與df.iloc&#xff0c;精準定位你想要的數據1.1基于條件篩選&#xff1a;過濾數據中的不恰當因素1.2 多條件組合篩選&#xff1a;精確鎖定目標數據1.3字符串…

小木的機器學習日記——KNN

核心知識點總結與星級排序我為你梳理了這節課的精髓&#xff0c;并按照重要性進行了星級評定&#xff08;★★★★★為最高&#xff09;。★★★★★ 核心思想&#xff1a;回歸 (Regression) 到底是什么&#xff1f;是否關鍵&#xff1a;是必須了解&#xff1a;是必須記住&…

Product Hunt 每日熱榜 | 2025-07-15

1. OpenArt One-Click Video Story 標語&#xff1a;一鍵即可將任何內容轉換為可隨時發布的視頻。 介紹&#xff1a;有一個創意、劇本、節奏&#xff0c;或者喜歡的角色嗎&#xff1f;OpenArt可以將它們變成一個視覺故事—完整的畫面、音樂和敘事結構&#xff0c;輕松實現&am…

Dubbo高階難題:異步轉同步調用鏈上全局透傳參數的丟失問題

?問題場景?&#xff1a; 在分布式電商系統中&#xff0c;下單服務通過Dubbo調用庫存服務&#xff08;異步接口返回CompletableFuture&#xff09;&#xff0c;同時在Gateway層通過RpcContext設置traceId。你發現&#xff1a;當庫存服務內部同步調用其他服務時&#xff0c;tra…

實測兩款效率工具:駕考刷題和證件照處理的免費方案

今天阿燦給大家推薦兩款實用的軟件&#xff0c;一款是駕考助手&#xff0c;另一款是證件照制作軟件。第一款&#xff1a;駕考助手以前考駕照&#xff0c;很多人擔心過不了關&#xff0c;還會花冤枉錢買VIP練習&#xff0c;精選500題。其實&#xff0c;只要用對工具&#xff0c;…

Python 函數的維護性與復用性

目錄 一、從“能跑就行”到“能改不怕”——維護性的第一要義 二、單一職責與最小驚訝——維護性的縱深防御 三、可組合的樂高——復用性的第一階梯 四、面向協議設計——復用性的第二階梯 五、異常策略與日志——維護性的隱形護盾 七、測試金字塔——維護性的最后護城河…

C++中的模板參數 vs 函數參數:編譯期與運行期的分界線

引言 在日常開發中&#xff0c;我們經常接觸 函數參數&#xff0c;這是控制函數行為的最直接方式。但在 C 中還有一種強大的機制 —— 模板參數&#xff08;Template Parameters&#xff09;&#xff0c;它賦予了我們在編譯期就生成代碼結構的能力。 本文將通過直觀的類比&…