【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;它赋予了我们在编译期就生成代码结构的能力。 本文将通过直观的类比&…