当前位置: 首页 > news >正文

Swift 解 LeetCode 320:一行单词有多少种缩写可能?用回溯找全解

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
      • 例子
    • 题解答案
    • 题解代码分析(Swift 实现)
    • 题解代码详解
      • 每个位置的两种选择
      • 举个例子:word
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

如果你用过 Google Docs 或翻译软件,应该见过“缩写建议”的功能:比如 international 会被缩写成 i10l,这个“只保留首尾字母,其余用数字代替”的方式其实就是一种泛化缩写(Generalized Abbreviation)

LeetCode 320 要求我们列出一个单词的所有可能缩写方式。表面上是组合题,实则考你如何用递归 + 回溯 + 状态转移去遍历所有方案。

这篇文章用 Swift 带你一步步实现这个功能,并配上可运行的 Demo 和逻辑解析。适合初学者理解回溯思想,也适合面试前突击一波组合生成问题。

描述

给定一个单词 word,返回它的所有可能缩写方式,规则是:

  • 你可以用数字代替连续的一段字符,表示它们被“省略”;

  • 每个字符都可以选择保留 or 被缩写为某段数字。

例子

输入: "word"
输出(部分):

["word", "1ord", "w1rd", "wo1d", "wor1", "2rd", "w2d", "w1r1", "1o1d", "3d", "4", ...]

共计 2⁴ = 16 种可能缩写(因为每个字符都有两个选择:保留或缩写)。

题解答案

这类问题有个固定套路:

  1. 每一位都有“做 or 不做”的选择;

  2. 把这个选择过程用 递归(或 DFS) 表达出来;

  3. 用一个变量 count 来累积连续被略去的字符数量;

  4. 当递归结束时,把路径拼起来加入结果集。

所以这题本质上是一个经典的回溯遍历全排列问题,加上了缩写计数规则。

题解代码分析(Swift 实现)

func generateAbbreviations(_ word: String) -> [String] {var result = [String]()let chars = Array(word)func dfs(_ pos: Int, _ cur: String, _ count: Int) {if pos == chars.count {var abbr = curif count > 0 {abbr += String(count)}result.append(abbr)return}// 选:保留当前字符var keep = curif count > 0 {keep += String(count)}keep += String(chars[pos])dfs(pos + 1, keep, 0)// 不选:跳过当前字符,缩写计数 +1dfs(pos + 1, cur, count + 1)}dfs(0, "", 0)return result
}

题解代码详解

这段代码里,核心是递归函数 dfs(pos, cur, count)

  • pos:当前递归到第几个字母;

  • cur:当前拼接出来的缩写字符串;

  • count:当前累计省略(略去)的字符数。

每个位置的两种选择

  1. 保留这个字符

    • 如果之前略去了一段,要先把 count 加入字符串;

    • 然后加上当前字符;

    • 然后继续递归到下一位。

  2. 省略这个字符

    • 不修改字符串,只让 count + 1

    • 继续递归。

举个例子:word

word 开始:

  • w → o → r → d

  • 每个字母有保留或略过两种路径

最终会得到如下 16 个组合:

["word", "wor1", "wo1d", "wo2", "w1rd", "w1r1", "w2d", "w3","1ord", "1or1", "1o1d", "1o2", "2rd", "2r1", "3d", "4"]

示例测试及结果

let result = generateAbbreviations("word")
print(result.sorted())// 输出(排序后):
["1o1d", "1o2", "1or1", "1ord", "2r1", "2rd","3d", "4", "w1r1", "w1rd", "w2d", "w3","wo1d", "wo2", "wor1", "word"
]

这就是对 “word” 的所有缩写可能,非常完整。

时间复杂度

每个字符都有两个选择:保留 or 缩写。

  • 所以总组合数是 2ⁿ,n 是字符数;

  • 每次拼接字符串最多 O(n);

  • 所以总复杂度是:O(n * 2ⁿ)

这在 n ≤ 15 范围内是可接受的。

空间复杂度

  • 递归栈深度最多 n,空间复杂度 O(n)

  • 结果集大小是 O(2ⁿ),也要考虑在内

  • 所以总体空间复杂度是:O(n * 2ⁿ)

总结

LeetCode 320 是一道回溯入门经典题,它帮你建立以下几个意识:

  1. “每个位置都二选一” → DFS/回溯模型

  2. count 参数累积省略状态 → 不要用字符串 post-process

  3. 处理完后记得补上剩下的 count → 尾部的略写不能漏

http://www.lryc.cn/news/582163.html

相关文章:

  • 深入解析TCP:可靠传输的核心机制与实现逻辑(三次握手、四次挥手、流量控制、滑动窗口、拥塞控制、慢启动、延时应答、面向字节流、粘包问题)
  • 沉浸式视频的未来:MV-HEVC与3D-HEVC技术深度解析
  • 【STM32】const 变量存储学习笔记
  • 6,Receiving Messages:@KafkaListener Annotation
  • 【网络】Linux 内核优化实战 - net.ipv4.ip_local_port_range
  • 【方案】前端UI布局的绝技,响应式布局,多端适配
  • 医疗AI底层能力全链条工程方案:从技术突破到临床落地
  • 如何排查服务器中已经存在的后门程序?
  • Java基础--封装+static
  • 软件工程功能点估算基础
  • 软件工程功能点估算法常用术语介绍
  • jmm-内存屏障
  • MMaDA:多模态大型扩散语言模型
  • 边缘计算新底座:基于VPP+DPDK的开放智能网关
  • kafka总结
  • AI + 数据治理的趋势:让治理更智能、更敏捷
  • Web Worker:让前端飞起来的隐形引擎
  • 七牛云Java开发面试题及参考答案(60道面试题汇总)
  • 【C语言】指针与回调机制学习笔记
  • 1-Kafka介绍及常见应用场景
  • CAIDCP AI驱动安全专家认证将于8月正式上线,首期班开始报名
  • c++-引用(包括完美转发,移动构造,万能引用)
  • Qt中的坐标系
  • 算法————模拟算法
  • 机房运维篇(添加备份盘)加备份
  • mac中有多个java版本涉及到brew安装中,怎么切换不同版本
  • Playwright vs TestCafe 对象注入机制详解对比
  • Redis Tag 字段详解与最佳实践
  • 可扩展 Redis 查询引擎的最佳实践
  • 人工智能-基础篇-22-什么是智能体Agent?(具备主动执行和调优的人工智能产物)