LeetCode 472 连接词


文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 为什么要先按长度排序
      • DFS + 记忆化在这里解决了什么问题
      • 为什么不用 DP 数组直接做
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

LeetCode 472「连接词」是一道看起来像字符串处理,实际上是典型“字典 + DP / DFS”综合题
它非常容易写出“能跑但超时”的版本,也很容易在边界条件上踩坑。

这道题在真实业务中也并不陌生,比如:

  • 搜索引擎里的复合词拆分
  • NLP 中的分词与词典匹配
  • 用户输入校验、黑白词组合判断

这篇文章会从最直觉的思路开始,逐步推到一个稳定、不超时、可维护的 Swift 解法,并给出完整 Demo 和测试示例。

描述

题目给你一个没有重复单词的数组words,要求你找出其中所有的「连接词」。

什么叫连接词?

一个单词,完全由数组中至少两个更短的单词组成

注意几个隐藏点:

  • 至少两个,不是一个
  • 可以重复使用同一个单词
  • 顺序是拼接,不是打乱

比如:

"ratcatdogcat" = "rat" + "cat" + "dog" + "cat"

这道题如果你只是“能不能拆分字符串”,那就是 LeetCode 139;
但这里是要对数组里的每个词都做一次判断,而且不能用它自己当素材

题解答案

整体思路可以概括成一句话:

先把所有单词放进一个 Set,然后对每个单词做「能否由其他单词拼出来」的判断。

判断方式有很多,但工程上最稳的是:

  • 按长度排序
  • 逐个单词,用 DFS + 记忆化 或 DP 判断
  • 判断时,暂时把当前单词从词典中“视为不可用”

这样可以避免:

  • 自己拆自己
  • 重复计算
  • 深度递归导致的超时

题解代码分析

下面是一份完整、可运行的 Swift Demo,结构清晰,逻辑拆分明确。

classSolution{funcfindAllConcatenatedWordsInADict(_words:[String])->[String]{// 按长度排序,短词优先letsortedWords=words.sorted{$0.count<$1.count}varwordSet=Set<String>()varresult:[String]=[]forwordinsortedWords{ifword.isEmpty{continue}ifcanForm(word,wordSet){result.append(word)}wordSet.insert(word)}returnresult}privatefunccanForm(_word:String,_dict:Set<String>)->Bool{ifdict.isEmpty{returnfalse}letchars=Array(word)varmemo=Array(repeating:false,count:chars.count)funcdfs(_start:Int)->Bool{ifstart==chars.count{returntrue}ifmemo[start]{returnfalse}varcurrent=""foriinstart..<chars.count{current.append(chars[i])ifdict.contains(current){ifdfs(i+1){returntrue}}}memo[start]=truereturnfalse}returndfs(0)}}

为什么要先按长度排序

这是一个非常关键但容易被忽略的点

如果你不排序:

  • 长词先进入 Set
  • 在判断时,很可能会用“更长的词”去拆“更短的词”
  • 甚至出现自己拆自己的情况

排序后流程变成:

  1. 先把短词放进字典
  2. 再判断长词能不能由这些短词拼出来

这和真实世界里词典构建 → 复杂词分析的流程是完全一致的。

DFS + 记忆化在这里解决了什么问题

假设你有一个词:

"catsdogcats"

从第 0 位开始,有非常多的切分方式:

  • cat | sdogcats
  • cats | dogcats
  • catsdog | cats(失败)

如果你不做记忆化,每个失败路径都会被反复计算。

memo[start]的含义是:

start位置开始,已经验证过“拼不出来”,以后别再试了。

这一步是性能是否能过的关键

为什么不用 DP 数组直接做

当然可以,但 DFS 在 Swift 里写起来:

  • 更直观
  • 更贴近“拆字符串”的自然思路
  • 代码可读性更强

本质上,DFS + memo 和 DP 是等价的。

示例测试及结果

我们用题目里的示例来跑一遍。

letsolution=Solution()letwords1=["cat","cats","catsdogcats","dog","dogcatsdog","hippopotamuses","rat","ratcatdogcat"]print(solution.findAllConcatenatedWordsInADict(words1))// ["catsdogcats", "dogcatsdog", "ratcatdogcat"]letwords2=["cat","dog","catdog"]print(solution.findAllConcatenatedWordsInADict(words2))// ["catdog"]

输出结果和题目预期完全一致。

时间复杂度

设:

  • n是单词数量
  • L是单词最大长度

单个单词的 DFS 最坏情况下是O(L^2)
整体复杂度约为:

O(n * L^2)

在题目给定的约束下(总字符数 ≤ 1e5),是完全可以接受的。

空间复杂度

主要来自:

  • Set存储所有单词
  • DFS 的 memo 数组

空间复杂度约为:

O(n * L)

没有额外的高消耗结构。

总结

LeetCode 472 是一道非常典型的“工程型字符串题”,它考察的不是某个花哨算法,而是:

  • 是否能正确建模问题
  • 是否意识到“顺序”和“依赖关系”的重要性
  • 是否能控制递归与重复计算的成本

在真实业务中,这类问题经常出现在:

  • 搜索关键词分析
  • NLP 分词系统
  • 输入合法性校验
  • 规则引擎与词典系统

如果你能把这道题写到结构清晰、逻辑稳、性能可控,那说明你已经不只是“刷题”,而是在用工程思维解决问题。

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

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

相关文章

学习笔记-深入解析 epoll:Linux 高并发 I/O 的核心实现、实践与技术选型

在高并发网络编程领域&#xff0c;I/O 多路复用技术是提升服务器性能的核心支柱。Linux 系统的 I/O 多路复用方案从 select、poll 演进到 epoll&#xff0c;完成了从低效轮询到高效事件驱动的跨越式升级。epoll 凭借其卓越的性能&#xff0c;成为 Nginx、Redis、Node.js 等核心…

为了防雪崩加了限流,结果入口先挂了

限流&#xff0c;本来是为了保护系统。 但在这次事故中&#xff0c;限流器本身成了第一个被拖垮的组件。更糟的是&#xff1a;后端服务没来得及崩网关先失去了响应能力所有请求卡在入口这是一次非常典型的 “限流设计正确&#xff0c;但位置和实现错误” 的事故。一、事故背景系…

深度学习毕设选题推荐:基于python-CNN卷积神经网络对海洋壳类生物识别

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

芯片的“免疫系统”:为AI大模型芯片设计硬件级安全漏洞检测单元

当大语言模型以每秒数万亿次的计算在芯片上运行时,一个隐藏的硬件漏洞可能导致整个AI系统崩溃或数据泄露。如何在硬件层面构建实时的安全防线? 最近,研究人员发现超过38%的硬件设计包含潜在安全漏洞,这些漏洞一旦被利用,可能导致AI模型参数被窃取或计算过程被干扰。 传统…

智能合约团队协作:提示工程架构师的AI Prompt方案,统一开发规范

智能合约团队协作&#xff1a;提示工程架构师的 AI Prompt 方案与统一开发规范 摘要/引言 在智能合约开发领域&#xff0c;团队协作至关重要。随着人工智能&#xff08;AI&#xff09;技术的发展&#xff0c;提示工程在智能合约开发中展现出巨大潜力。然而&#xff0c;团队成员…

Kafka入门:从零开始掌握消息队列

前言在当今的分布式系统架构中&#xff0c;消息队列已经成为不可或缺的核心组件。Apache Kafka作为一款高吞吐量、低延迟的分布式消息系统&#xff0c;被广泛应用于大数据处理、日志收集、流式处理等场景。一、Kafka是什么&#xff1f;Apache Kafka是一个分布式流处理平台&…

鸿蒙后台任务:ServiceExtensionAbility 中短时任务和长时任务到底怎么选?

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

小白学C指针 *

1. & 取地址符 - “在哪里&#xff1f;” int a 10; // a 是个变量&#xff0c;值是 10 &a // 这是 a 的地址&#xff08;门牌号&#xff09;&#xff0c;比如 0x7ffeeb0b1234比喻&#xff1a; a 你家的电视机&#xff08;值&#xff09;&a …

计算机深度学习毕设实战-基于python-CNN卷积神经网络对海洋壳类生物识别

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

2024年AI原生应用在事实核查领域的最新研究进展

当AI成为“真相侦探”&#xff1a;2024年AI原生事实核查的进化与突破 关键词 AI原生应用、事实核查、大语言模型(LLM)、多模态推理、实时核查、可信AI、知识图谱 摘要 在虚假信息像“数字病毒”一样蔓延的今天&#xff0c;事实核查已成为维护信息生态的“免疫系统”。但传统核查…

【小程序】订单数据缓存 以及针对海量库存数据的 懒加载+数据分片 的具体实现方式

订单数据缓存 以及针对海量库存数据的 懒加载数据分片 的具体实现方式&#xff0c;结合UniApp微信小程序的技术栈&#xff0c;分两部分详细拆解落地思路和核心代码&#xff0c;既讲逻辑也给可落地的实现方案。 一、订单数据缓存的实现&#xff08;低网环境适配核心&#xff09;…

救命神器2026专科生必看!8个AI论文网站深度测评与推荐

救命神器2026专科生必看&#xff01;8个AI论文网站深度测评与推荐 2026年专科生论文写作必备工具测评 随着AI技术的不断进步&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的论文辅助平台&#xff0c;如何选择真正适合自己需…

FHIR 中 _summary 参数

前言 在构建基于 HL7 FHIR&#xff08;Fast Healthcare Interoperability Resources&#xff09;标准的医疗信息系统时&#xff0c;开发者和架构师常常面临一个关键问题&#xff1a;如何在保证数据完整性的同时&#xff0c;优化网络传输效率与客户端处理性能&#xff1f; FHI…

AI自动化编排:从入门到精通(基于Dify构建AI智能系统)

目录第一篇&#xff1a;范式重构 —— AI 编排底层基石第1章 AI 自动化编排&#xff1a;开启“人机协同”新时代1.1 从命令式编程到声明式编排1.2 LLM 为什么需要“手脚”&#xff1a;AI 应用的三阶段演化1.3 AI 编排的核心目标&#xff1a;让系统具备行动能力1.4 技术选型逻辑…

Nuxt3全栈开发实战指南

目录第一篇&#xff1a;全栈基石 —— Nuxt 核心概念篇第 1 章&#xff1a;NuxtJS 的前世今生与生态位现代 Web 开发的痛点&#xff08;SEO、白屏、开发效率&#xff09;什么是 NuxtJS&#xff1a;Vue 3 的超集与全栈框架SSR&#xff08;服务端渲染&#xff09;、SSG&#xff0…

为什么AI算法工程师年薪能破百万?大厂高薪岗位学习指南与实战经验分享_月薪35-50k 16薪

大模型算法工程师成为当前薪资最高的技术岗位&#xff0c;月薪中位数近3万元&#xff0c;顶尖人才年薪破百万。字节、腾讯等大厂大量扩招AI人才&#xff0c;DeepSeek等开出高达154万年薪。然而多数求职者能力不足以满足企业需求。《AI算法工程师培养计划》由一线大厂专家主讲&a…

深度学习计算机毕设之基于python-CNN深度学习的卷积神经网络对狗的行为识别

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

不用卡尺怎么测量复杂零件尺寸?告别卡尺,精准高效:SIMSCAN-E手持扫描仪在复杂零件检测中的革命性应用

告别卡尺&#xff0c;精准高效&#xff1a;SIMSCAN-E手持扫描仪在复杂零件检测中的革命性应用图1&#xff1a;思看科技&#xff08;SCANTECH&#xff09;—全球领先的三维视觉产品与解决方案提供商一、机械加工与来料检测的挑战&#xff1a;传统测量方法的局限在机械加工和来料…

【毕业设计】深度学习基于python-CNN深度学习对宠物体型识别

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

【毕业设计】深度学习基于python-CNN深度学习对宠物体型识别

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