LeetCode 249 解法揭秘:如何把“abc”和“bcd”分到一组?

news2025/4/6 16:45:20

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

文章目录

    • 摘要
    • 描述
    • 痛点分析 & 实际应用场景
    • Swift 题解答案
    • 可运行 Demo 代码
    • 题解代码分析
      • 差值是怎么来的?
      • 为什么加 `+26` 再 `%26`?
    • 示例测试及结果
    • 时间复杂度分析
    • 空间复杂度分析
    • 总结

摘要

你有没有遇到过这种情况:有一堆字符串,看起来只是“平移”了一下,比如 abc -> bcd,或者 az -> ba,虽然字母换了,但它们给人的感觉还是很像。LeetCode 第 249 题就正好考了这个点:把所有属于同一个“移位字符串序列”的东西分成一组。

别看题目挺简单,其实要把这类“差不多但不完全一样”的字符串精准归类,还是有点技术含量的。这篇文章用 Swift 来做这道题,并结合实际开发场景讲讲它能怎么用,还会附上完整可运行的 Demo 和讲解。

描述

我们有一个只包含小写字母的字符串列表,比如:

["abc", "bcd", "acef", "xyz", "az", "ba", "a", "z"]

我们希望把其中属于同一“移位序列”的字符串分组。比如:

  • "abc" -> "bcd" -> "cde",这类的归一组
  • "az""ba",虽然乍看没啥关系,但实际上也算同一个“偏移规律”,可以放一起
  • "acef" 没有能跟它组队的,就自己一组

最后的输出应该是这样:

[
  ["abc","bcd","xyz"],
  ["az","ba"],
  ["acef"],
  ["a","z"]
]

痛点分析 & 实际应用场景

这个题其实挺有意思,因为它背后解决的是一种非常实际的问题:怎么找出那些“表面不一样、但本质上变化规律相同”的东西。你可能会觉得这玩意平时开发用不着,但我们来看几个真实场景:

1. 防刷系统识别:

在社交平台上,有些用户发骚扰信息时会稍微改一下内容,比如:

"hi there" -> "ij uifsf" -> "jk vjgtg"

其实就是每个字母往后挪了一位、两位、三位…你肉眼一看很像,但程序该怎么识别出来这是一类“伪装”的垃圾信息呢?这道题的逻辑就能用上。

2. 智能输入法候选词推荐:

用户打了个错别字,比如输入 bcd,其实是想输入 abc,那我们能不能把这种偏移关系也识别出来作为候选词推荐?靠的也是类似的偏移计算。

3. 密码安全检测:

用户试图设置一个和之前密码差不多的新密码,比如原来是 abc123,新设置成 bcd123,其实没啥变化。这种逻辑在安全校验里也是经常遇到的。

4. 自然语言处理中的文本聚类:

比如说一个聊天机器人收集到很多用户的意图,但有一类人喜欢换着字母输入(变形词),你就需要判断这是不是同一类话术模式。

说到底,这题就是在考“如何识别相似但又不是完全一样的内容”。

Swift 题解答案

思路其实不复杂,我们可以对每个字符串生成一个“差值序列”当作 key,比如:

  • abc 的字符间差值是 [1, 1]
  • bcd 也是 [1, 1]
  • az 是 [25]

我们把这些差值转换成字符串作为 map 的 key,然后分组就行了。

可运行 Demo 代码

import Foundation

func groupStrings(_ strings: [String]) -> [[String]] {
    var groups = [String: [String]]()

    for str in strings {
        var key = ""
        let chars = Array(str)

        for i in 1..<chars.count {
            let diff = (Int(chars[i].asciiValue!) - Int(chars[i - 1].asciiValue!) + 26) % 26
            key += "\(diff),"
        }

        groups[key, default: []].append(str)
    }

    return Array(groups.values)
}

题解代码分析

我们来拆解一下关键部分:

差值是怎么来的?

举个例子,abc 中:

  • 'b' - 'a' = 1
  • 'c' - 'b' = 1

差值数组就是 [1, 1],我们转成 "1,1," 当作 key。只要差值序列一样,说明这个字符串和前面的某个是“移位版本”。

为什么加 +26%26

因为我们要处理 'z' -> 'a' 这种环绕关系。比如:

let diff = ('a' - 'z' + 26) % 26 // 结果是 1

这样 azba 这类看似不连贯的字符串,也能算是同一组。

示例测试及结果

来跑个例子看看效果:

let input = ["abc", "bcd", "acef", "xyz", "az", "ba", "a", "z"]
let result = groupStrings(input)

for group in result {
    print(group)
}

打印结果:

["abc", "bcd", "xyz"]
["az", "ba"]
["acef"]
["a", "z"]

这就和题目期望一模一样。

时间复杂度分析

假设我们有 n 个字符串,每个字符串长度最多 k

  • 外层遍历所有字符串是 O(n)
  • 内层处理每个字符串生成 key 是 O(k)

所以总体复杂度是 O(n * k)

空间复杂度分析

我们用了一个字典来分组,最坏情况下每个字符串都分一组,字典大小也是 O(n * k)(因为 key 是字符串差值序列)

总结

这题核心是找出规律:“移位”的本质就是字符间的差值一致。不需要真的去“移”字符串,只要你能拿到这个差值序列,你就能判断两个字符串是不是一个套路。

另外也提醒我们,在实际开发中处理字符串聚类或异常识别时,找对特征比暴力匹配要高效得多。这个题的差值 key 就是一个很实用的“特征”。

如果你在做一些输入推荐、内容防刷、文本归类功能,不妨试试看用类似的方式去做聚类、查重或识别。

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

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

相关文章

Python数据可视化-第4章-图表样式的美化

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第4章 图表样式的美化 本章主要介绍了图表样式的美化&#xff0c;包括图表样式概述、使用颜色、选择线型、添加数据标记、设置字体…

ROS Master多设备连接

Bash Shell Shell是位于用户与操作系统内核之间的桥梁&#xff0c;当用户在终端敲入命令后&#xff0c;这些输入首先会进入内核中的tty子系统&#xff0c;TTY子系统负责捕获并处理终端的输入输出流&#xff0c;确保数据正确无误的在终端和系统内核之中。Shell在此过程不仅仅是…

系统思考:思考的快与慢

在做重大决策之前&#xff0c;什么原因一定要补充碳水化合物&#xff1f;人类的大脑其实有两套运作模式&#xff1a;系统1&#xff1a;自动驾驶模式&#xff0c;依赖直觉&#xff0c;反应快但易出错&#xff1b;系统2&#xff1a;手动驾驶模式&#xff0c;理性严谨&#xff0c;…

音视频入门基础:RTP专题(21)——使用Wireshark分析海康网络摄像机RTSP的RTP流

一、引言 使用vlc等播放器可以播放海康网络摄像机的RTSP流&#xff1a; 网络摄像机的RTSP流中&#xff0c;RTSP主要用于控制媒体流的传输&#xff0c;如播放、暂停、停止等操作。RTSP本身并不用于转送媒体流数据&#xff0c;而是会通过PLAY方法使用RTP来传输实际的音视频数据。…

04.游戏开发-unity编辑器详细-工具栏、菜单栏、工作识图详解

04.游戏开发&#xff0c;unity编辑器详细-工具栏、菜单栏、工作识图详解 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性&#xff0c;希…

QGIS中第三方POI坐标偏移的快速校正-百度POI

1.百度POI&#xff1a; name,lng,lat,address 龙记黄焖鸡米饭(共享区店),121.908315,30.886636,南汇新城镇沪城环路699弄117号(A1区110室) 好福记黄焖鸡(御桥路店),121.571409,31.162292,沪南路2419弄26号1层B间 御品黄焖鸡米饭(安亭店),121.160322,31.305977,安亭镇新源路792号…

Pycharm 启动时候一直扫描索引/更新索引 Update index/Scanning files to index

多个项目共用一个虚拟环境&#xff0c;有助于加快PyCharm 启动吗 chatgpt 4o认为很有帮助&#xff0c;gemini 2.5pro认为没鸟用&#xff0c;我更认可gemini的观点。不知道他们谁在一本正经胡说八道。 -------- 打开pycharm的时候&#xff0c;下方的进度条一直显示在扫描文件…

Vanna:用检索增强生成(RAG)技术革新自然语言转SQL

引言&#xff1a;为什么我们需要更智能的SQL生成&#xff1f; 在数据驱动的业务环境中&#xff0c;SQL 仍然是数据分析的核心工具。然而&#xff0c;编写正确的 SQL 查询需要专业知识&#xff0c;而大型语言模型&#xff08;LLM&#xff09;直接生成的 SQL 往往存在**幻觉&…

CKPT文件是什么?

检查点&#xff08;Checkpoint&#xff0c;简称ckpt&#xff09;是一种用于记录系统状态或数据变化的技术&#xff0c;广泛应用于数据库管理、机器学习模型训练、并行计算以及网络安全等领域。以下将详细介绍不同领域中ckpt检查点的定义、功能和应用场景。 数据库中的ckpt检查点…

Android使用OpenGL和MediaCodec录制

目录 一,什么是opengl 二,什么是Android OpenGL ES 三, OpenGL 绘制流程 四, OpenGL坐标系 五, OpenGL 着色器 六, GLSL编程语言 七,使用MediaCodec录制在Opengl中渲染架构 八,代码实现 8.1 自定义渲染view继承GLSurfaceView 8.2 自定义渲染器TigerRender 8.3 创建编…

《如何避免虚无》速读笔记

文章目录 书籍信息概览躺派&#xff08;出世&#xff09;卷派&#xff08;入世&#xff09;虚无篇&#xff1a;直面虚无自我篇&#xff1a;认识自我孤独篇&#xff1a;应对孤独幸福篇&#xff1a;追寻幸福超越篇&#xff1a;超越自我 书籍信息 书名&#xff1a;《如何避免虚无…

哈尔滨工业大学:大模型时代的具身智能

大家好&#xff0c;我是樱木。 机器人在工业领域&#xff0c;已经逐渐成熟。具身容易&#xff0c;智能难。 机器人-》智能机器人&#xff0c;需要自主能力&#xff0c;加上通用能力。 智能机器人-》人类&#xff0c;这个阶段就太有想象空间了。而最受关注的-类人机器人。 如何…

理解OSPF 特殊区域NSSA和各类LSA特点

本文基于上文 理解OSPF Stub区域和各类LSA特点 在理解了Stub区域之后&#xff0c;我们再来理解一下NSSA区域&#xff0c;NSSA区域用于需要引入少量外部路由&#xff0c;同时又需要保持Stub区域特性的情况 一、 网络总拓扑图 我们在R1上配置黑洞路由&#xff0c;来模拟NSSA区域…

如何通过优化HMI设计大幅提升产品竞争力?

一、HMI设计的重要性与竞争力提升 HMI&#xff08;人机交互界面&#xff09;设计在现代产品开发中扮演着至关重要的角色。良好的HMI设计不仅能够提升用户体验&#xff0c;还能显著增强产品的竞争力。在功能趋同的市场环境中&#xff0c;用户体验成为产品竞争的关键。HMI设计通…

Linux信号——信号的处理(3)

信号是什么时候被处理&#xff1f; 进程从内核态&#xff0c;切换到用户态的时候&#xff0c;信号会被检测处理。 内核态&#xff1a;操作系统的状态&#xff0c;权限级别高 用户态&#xff1a;你自己的状态 内核态和用户态 进程地址空间第三次 所谓的系统调用本质其实是一堆…

Pod的调度

在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到达某些节点上&…

LabVIEW面向对象编程设计方法

一、概述 面向对象编程&#xff08;OOP&#xff09;在软件开发中占据重要地位&#xff0c;尤其是在大规模软件项目中。它与小型程序开发思路不同&#xff0c;更注重未来功能的升级与扩展。在设计阶段&#xff0c;需思考如何构建既灵活又稳定的系统&#xff0c;这涉及众多设计方…

Dify票据识别遇到的分支判断不准确问题

已测试这篇文章中 https://zhuanlan.zhihu.com/p/5465385787 使用多分支条件判断使用不同的大模型识别图片内容 发现了细节问题。在使用时若不注意&#xff0c;分支会出现走向不准的问题。 需要关注部分 下方红框处。1&#xff0c;2后不能跟点。否则会出问。除此之外&#xff0…

《全栈+双客户端Turnkey方案》架构设计图

今天分享一些全栈双客户端Turnkey方案的架构与结构图。 1&#xff1a;三种分布式部署方案:网关方案&#xff0c;超级服务器单服方案&#xff0c;直连逻辑服方案 2: 单服多线程核心架构: 系统服务逻辑服服务 3: 系统服务的多线程池调度设计 4:LogicServer Update与ECS架构&…

某碰瓷国赛美赛,号称第三赛事的数模竞赛

首先我非常不能理解的就是怎么好意思自称第三赛事的呢&#xff1f;下面我们进行一个简单讨论&#xff0c;当然这里不对国赛和美赛进行讨论。首先我们来明确一点&#xff0c;比赛的含金量由什么来定&#xff1f;这个可能大家的评价指标可能不唯一&#xff0c;我通过DeepSeek选取…