算法题 验证外星语词典

953. 验证外星语词典

问题描述

在某种外星语言中,字母表的顺序与英语不同。给定一个字符串数组words和一个表示外星字母表顺序的字符串order,验证这些单词是否按照外星字母表的字典序排列。

字典序规则

  • 比较两个单词时,从左到右逐字符比较
  • 第一个不同的字符决定两个单词的顺序
  • 如果一个单词是另一个单词的前缀,则较短的单词排在前面

示例

输入: words = ["hello","leetcode"], order = "hlabcdefgijkmnopqrstuvwxyz" 输出: true 解释: 'h' 在外星字母表中排在 'l' 前面,所以 "hello" < "leetcode" 输入: words = ["word","world","row"], order = "worldabcefghijkmnpqstuvxyz" 输出: false 解释: "word" 和 "world" 的前缀相同,但 "word" 是 "world" 的前缀,应该排在前面。 但 "row" 应该排在 "world" 前面,因为 'r' < 'w',但实际上 "world" 排在 "row" 前面。 输入: words = ["apple","app"], order = "abcdefghijklmnopqrstuvwxyz" 输出: false 解释: "app" 是 "apple" 的前缀,应该排在前面,但实际顺序相反。

算法思路

自定义比较函数

核心思想

  1. 建立字符映射:将外星字母表中的每个字符映射到其在字母表中的位置(0-25)
  2. 逐对比较:遍历相邻的单词对,验证是否按外星字典序排列
  3. 自定义比较:实现一个函数来比较两个单词在外星字母表下的字典序

比较两个单词的规则

  • 从左到右逐字符比较
  • 找到第一个不同的字符,根据外星字母表顺序判断
  • 如果所有对应字符都相同,较短的单词应该排在前面

代码实现

方法一:映射 + 逐对比较

classSolution{/** * 验证外星语词典是否按字典序排列 * * @param words 单词数组 * @param order 外星字母表顺序 * @return 如果单词按外星字典序排列返回true,否则返回false */publicbooleanisAlienSorted(String[]words,Stringorder){// 边界情况处理if(words==null||words.length<=1){returntrue;}// 建立字符到位置的映射int[]charOrder=newint[26];for(inti=0;i<order.length();i++){charOrder[order.charAt(i)-'a']=i;}// 验证相邻单词for(inti=0;i<words.length-1;i++){if(!isLessOrEqual(words[i],words[i+1],charOrder)){returnfalse;}}returntrue;}/** * 比较两个单词是否满足 word1 <= word2(按外星字典序) */privatebooleanisLessOrEqual(Stringword1,Stringword2,int[]charOrder){intlen1=word1.length();intlen2=word2.length();intminLength=Math.min(len1,len2);// 字符比较for(inti=0;i<minLength;i++){charc1=word1.charAt(i);charc2=word2.charAt(i);if(c1!=c2){// 找到第一个不同的字符,比较它们的外星顺序returncharOrder[c1-'a']<charOrder[c2-'a'];}}// 所有对应字符都相同,较短的单词应该排在前面returnlen1<=len2;}}

算法分析

  • 时间复杂度:O©
    • C 是所有单词的字符总数
    • 需要遍历每个字符最多一次
  • 空间复杂度:O(1)
    • 只需要固定大小的映射数组(26个字符)

算法过程

输入:words = ["hello","leetcode"],order = "hlabcdefgijkmnopqrstuvwxyz"

  1. 建立映射
    • 'h' → 0,'l' → 1,'a' → 2,'b' → 3, …
  2. 比较 “hello” 和 “leetcode”
    • 第一个字符:'h'vs'l'
    • 外星顺序:0 < 1
    • 返回true

输入:words = ["apple","app"],order = "abcdefghijklmnopqrstuvwxyz"

  1. 比较 “apple” 和 “app”
    • 前3个字符相同:'a','p','p'
    • “apple” 长度为5,“app” 长度为3
    • 由于没有找到不同字符且5 > 3,返回false

输入:words = ["word","world","row"],order = "worldabcefghijkmnpqstuvxyz"

  1. 建立映射'w'→0, 'o'→1, 'r'→2, 'l'→3, 'd'→4, ...
  2. 比较 “word” 和 “world”
    • 前4个字符相同
    • “word” 长度4 < “world” 长度5
  3. 比较 “world” 和 “row”
    • 第一个字符:'w'vs'r'
    • 外星顺序:0 > 2
    • 返回false

测试用例

publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:标准示例String[]words1={"hello","leetcode"};Stringorder1="hlabcdefgijkmnopqrstuvwxyz";System.out.println("Test 1: "+solution.isAlienSorted(words1,order1));// true// 测试用例2:前缀问题String[]words2={"apple","app"};Stringorder2="abcdefghijklmnopqrstuvwxyz";System.out.println("Test 2: "+solution.isAlienSorted(words2,order2));// false// 测试用例3:复杂无效序列String[]words3={"word","world","row"};Stringorder3="worldabcefghijkmnpqstuvxyz";System.out.println("Test 3: "+solution.isAlienSorted(words3,order3));// false// 测试用例4:单单词String[]words4={"hello"};System.out.println("Test 4: "+solution.isAlienSorted(words4,order1));// true// 测试用例5:空数组String[]words5={};System.out.println("Test 5: "+solution.isAlienSorted(words5,order1));// true// 测试用例6:两个相同单词String[]words6={"hello","hello"};System.out.println("Test 6: "+solution.isAlienSorted(words6,order1));// true// 测试用例7:正确前缀顺序String[]words7={"app","apple"};System.out.println("Test 7: "+solution.isAlienSorted(words7,order2));// true// 测试用例8:全相同首字母String[]words8={"aa","ab","ac"};Stringorder8="abcdefghijklmnopqrstuvwxyz";System.out.println("Test 8: "+solution.isAlienSorted(words8,order8));// true// 测试用例9:逆序String[]words9={"ac","ab","aa"};System.out.println("Test 9: "+solution.isAlienSorted(words9,order8));// false// 测试用例10:外星字母表完整String[]words10={"kuvp","q"};Stringorder10="ngxlkthsjuoqcpavbfdermiywz";System.out.println("Test 10: "+solution.isAlienSorted(words10,order10));// true// 'k' 在字母表中位置比 'q' 靠前// 测试用例11:长单词String[]words11={"fxasxpc","dfbdrifhp","nwzgs","cmwvwngxry","bj","nwzgs","dfbdrifhp","fxasxpc"};Stringorder11="qwertyuiopasdfghjklzxcvbnm";System.out.println("Test 11: "+solution.isAlienSorted(words11,order11));// false}

关键点

  1. 字符映射

    • 将外星字母表转换为数字索引
    • O(1) 时间复杂度的字符比较
  2. 相邻对验证

    • 字典序具有传递性
    • 只需验证相邻对就能保证全局有序
  3. 前缀处理

    • 当一个单词是另一个的前缀时,较短的应该排在前面
  4. 边界情况

    • 空数组和单元素数组
    • 相同单词的处理
    • 不同长度单词的比较

常见问题

  1. 为什么只需要比较相邻单词?
    • 字典序是传递的:如果 A ≤ B 且 B ≤ C,则 A ≤ C

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1169129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java毕设选题推荐:基于SpringBoot濒危物种救助信息共享、资源整合调度公益救助交流平台基于SpringBoot濒危物种公益救助交流平台【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

9款免费AI论文生成器实操指南:维普查重一把过不留AIGC痕迹

还在为论文开题、写作、降重、查重而焦虑吗&#xff1f;面对导师的修改意见感到无从下手&#xff1f;担心AI生成的论文被系统检测出来&#xff1f;这篇文章就是为你准备的终极解决方案。我们亲测了市面上9款热门且实用的免费AI论文工具&#xff0c;为你整理出这份手把手的实操指…

如何优化销售流程提升效率?关键在于“找对人、说对话、快成交”

在B2B销售过程中&#xff0c;80%的时间常常会浪费在无效的环节上&#xff0c;销售人员进行海量拨号&#xff0c;但90%接通电话的是前台或者基层业务员&#xff1b;反复跟进客户&#xff0c;却始终无法接触到能够拍板的决策者&#xff1b;精心准备了提案&#xff0c;最终却因为对…

《从零学习JMeter》第二篇:JMeter参数化完全指南:从入门到实战避坑

在使用JMeter进行性能测试时&#xff0c;你是否遇到过这样的困扰&#xff1a;用固定账号密码测试登录接口&#xff0c;无法模拟多用户并发&#xff1b;每次测试不同商品ID都要修改脚本&#xff0c;效率极低&#xff1b;接口依赖的token需要手动复制粘贴&#xff0c;根本无法自动…

ACPI!ACPIBuildDeviceDpc函数分析从ACPIBuildProcessQueueList结束后到处理AcpiBuildRunMethodList

ACPI!ACPIBuildDeviceDpc函数分析从ACPIBuildProcessQueueList结束后到第一次运行ACPI!ACPIBuildProcessGenericList处理AcpiBuildRunMethodList第一次运行ACPI!ACPIBuildProcessGenericList第一部分&#xff1a; 0: kd> g Breakpoint 24 hit eax00000000 ebx80afae90 ecxf7…

基于django 的人工智能研讨社区系统

目录基于Django的人工智能研讨社区系统关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于Django的人工智能研讨社区系统 该系统是一个专为人工智能领域研究者、开发者及爱好者设计…

收藏必看!小白入门:一文搞懂LLMs、RAG与AI Agent的区别与应用

文章解析AI三大核心技术&#xff1a;LLMs作为"天才大脑"提供思考能力但知识有限&#xff1b;RAG作为记忆系统连接外部知识库解决实时性问题&#xff1b;AI Agent作为执行层实现自主行动。三者非竞争关系&#xff0c;而是协同工作&#xff0c;分别负责思考、认知和执行…

斯坦福+伯克利联手解决大模型长上下文难题,TTT-E2E技术详解与谷歌Titans对比,打造个人专属LLM指南

文章详解斯坦福和伯克利联合研发的TTT-E2E技术&#xff0c;这是一种解决大模型长上下文记忆问题的新方法。与传统固定模型不同&#xff0c;TTT-E2E在推理过程中更新参数存储记忆。文章对比了其与谷歌Titans的差异、更新机制和实际效果&#xff0c;并探讨了打造个人专属大模型的…

基于django 的学生网上选课系统的设计

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 该系统基于Django框架开发&#xff0c;旨在为学生提供高效、便捷的在线选课服务。通过模块化设计&#xff0c;系统分为…

数字孪生项目的外包开发流程

数字孪生&#xff08;Digital Twin&#xff09;外包开发相比传统软件开发更为复杂&#xff0c;因为它涉及物理建模、实时数据集成、仿真算法以及可视化渲染四个维度的深度结合。数字孪生项目的标准外包开发流程通常分为以下六个阶段&#xff1a;1. 需求分析与场景定义这是项目成…

Ubuntu启动盘制作

制作 Ubuntu 启动盘有两种主流方案&#xff1a; 一次性写入&#xff08;Rufus&#xff0c;简单直接&#xff09;&#xff1b;多镜像共存&#xff08;Ventoy&#xff0c;后期可随意增删 ISO&#xff09;。 下面分别给出 Windows 环境下的完整步骤&#xff0c;按需要任选其一即可…

基于django的超市进销存管理系统 供应商

目录供应商管理模块摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;供应商管理模块摘要 Django框架下的超市进销存管理系统中&#xff0c;供应商管理是核心模块之一&#xff0c…

导师推荐!9款AI论文写作软件测评:本科生毕业论文全攻略

导师推荐&#xff01;9款AI论文写作软件测评&#xff1a;本科生毕业论文全攻略 2026年AI论文写作工具测评&#xff1a;为本科生量身打造的高效指南 随着人工智能技术在学术领域的广泛应用&#xff0c;越来越多的本科生开始借助AI论文写作工具提升写作效率、优化内容质量。然而&…

AI 写论文哪个软件最好?实测虎贲等考 AI:毕业论文的智能通关密钥

毕业季的论文战场&#xff0c;“AI 写论文哪个软件最好” 的灵魂拷问&#xff0c;总能在各大高校的互助群里刷屏。不少同学踩坑无数&#xff1a;有的工具生成内容空洞无物&#xff0c;有的文献引用漏洞百出&#xff0c;有的查重结果与学校标准脱节。作为深耕论文写作科普的测评…

全网最全2026本科生AI论文工具TOP10测评

全网最全2026本科生AI论文工具TOP10测评 2026年本科生AI论文工具测评&#xff1a;为什么你需要这份指南&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的AI论文生成与辅助工具&…

基于django框架和python的的实验室机房预约管理系统的

目录实验室机房预约管理系统摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;实验室机房预约管理系统摘要 该系统基于Django框架与Python语言开发&#xff0c;旨在实现高校或科研…

程序员必学!Claude Skills与MCP协同实战:构建智能代理的收藏级指南

文章介绍了Anthropic的Claude模型中Skills与MCP的协同机制。MCP提供对外部系统的标准化连接&#xff0c;而Skills提供工作流程逻辑&#xff0c;指导Claude有效使用这些工具。两者结合可构建遵循特定工作流程的智能代理&#xff0c;实现清晰的数据发现、可靠的任务编排和一致的性…

开题报告怎么写?宏智树 AI 手把手教你搞定学术第一步

作为深耕论文写作科普的教育博主&#xff0c;后台每天都被开题报告的求助淹没&#xff1a;“选题太泛被导师打回三次”“文献综述写成流水账”“研究方法不落地”“技术路线图画得像天书”…… 开题报告是学术研究的 “施工图”&#xff0c;写不好不仅过不了答辩&#xff0c;更…

基于djangos线上美食社区论坛交流系统

目录Django 线上美食社区论坛交流系统摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;Django 线上美食社区论坛交流系统摘要 Django 线上美食社区论坛交流系统是一个基于 Pytho…

收藏必备!30+程序员转行AI大模型指南:从入门到实战,抓住科技新风口!_30岁程序员失业,转行大模型还来得及吗?

转行AI大模型是明智选择&#xff0c;市场需求旺盛&#xff0c;30程序员凭借技术积累、跨领域知识和抗压能力更具优势。学习可分为初阶应用、高阶应用、模型训练和商业闭环四个阶段&#xff0c;系统掌握大模型技术后&#xff0c;可成为全栈工程师&#xff0c;解决实际项目需求&a…