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

LeetCode 387 字符串中的第一个唯一字符 Swift 题解:用哈希表快速定位不重复字符

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

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码拆解
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在日常开发中,处理字符串是最常见的任务之一。有时候我们需要从一段文字里找到某个“特殊”的字符,比如:

  • 在用户输入的用户名里,找到第一个唯一字符来生成推荐 ID;
  • 在聊天消息里快速定位第一个不重复的字母,做关键词标记;
  • 在日志文件里扫描异常标识符时,优先取第一个独特的符号。

这道题就是一个简化版的需求:给定一个字符串,找到第一个不重复的字符并返回它的下标,如果没有就返回 -1。

描述

题目要求:

  • 输入一个字符串 s,只包含小写字母。
  • 找到第一个 只出现一次的字符,返回它的索引。
  • 如果不存在,返回 -1

举几个例子:

  • s = "leetcode" → 第一个不重复的字符是 l,下标 0
  • s = "loveleetcode" → 第一个不重复的字符是 v,下标 2
  • s = "aabb" → 没有唯一字符,返回 -1

题解答案

最直观的想法:

  1. 我们需要知道每个字符出现了多少次。
  2. 再从左到右扫描一次,找到第一个只出现一次的字符。

这就很自然地联想到 哈希表(字典)来存储字符出现次数。

题解代码分析

下面是 Swift 实现:

import Foundationclass Solution {func firstUniqChar(_ s: String) -> Int {var frequency: [Character: Int] = [:]// 第一次遍历:统计每个字符的出现次数for ch in s {frequency[ch, default: 0] += 1}// 第二次遍历:找到第一个出现次数为 1 的字符for (index, ch) in s.enumerated() {if frequency[ch] == 1 {return index}}return -1}
}

代码拆解

  1. 统计字符出现次数

    • 用一个字典 frequency 存储每个字符出现的次数。
    • 遍历字符串时,frequency[ch, default: 0] += 1 是 Swift 的简洁写法,如果字典里没有该字符,就先设为 0。
  2. 寻找第一个唯一字符

    • 再次遍历字符串。
    • 如果某个字符在字典里的次数是 1,就直接返回它的索引。
  3. 不存在时返回 -1

    • 如果整串字符串都找不到唯一字符,就返回 -1

这个思路简单高效,只需要两次遍历。

示例测试及结果

我们写一个小 demo 来验证:

let solution = Solution()let ex1 = "leetcode"
print("输入: \(ex1)")
print("输出: \(solution.firstUniqChar(ex1))\n")let ex2 = "loveleetcode"
print("输入: \(ex2)")
print("输出: \(solution.firstUniqChar(ex2))\n")let ex3 = "aabb"
print("输入: \(ex3)")
print("输出: \(solution.firstUniqChar(ex3))\n")

运行结果:

输入: leetcode
输出: 0输入: loveleetcode
输出: 2输入: aabb
输出: -1

完全符合题意。

时间复杂度

  • 第一次遍历统计次数 O(n)。
  • 第二次遍历查找唯一字符 O(n)。
  • 总体 O(n),满足要求。

空间复杂度

  • 额外使用一个字典存储字符次数。
  • 因为输入只包含 26 个小写字母,所以字典最多存 26 个键值对。
  • 空间复杂度是 O(1)(常量级,不随字符串长度变化)。

总结

这道题是典型的 哈希计数 + 遍历 问题,属于“快手题”,但在实际开发中也挺有用:

  • 处理用户输入时,快速找到独特标识;
  • 日志分析时定位第一个独特的关键字;
  • 文件名或标签扫描时,获取第一个唯一项。

它的思路非常清晰:

  • 先统计,再查找,一步步缩小问题。
  • 算法复杂度最优,额外空间需求也很低。

如果把题目升级,比如要求 返回所有唯一字符,思路也可以沿用,只是改成收集所有出现一次的字符。

http://www.dtcms.com/a/404054.html

相关文章:

  • 面试复习题---加固技术原理
  • 小蜜蜂网站建设免费摄影网站推荐
  • 青岛网站推广哪家效果好朝阳网站
  • Linux安全机制--网络层安全机制
  • pc端与手机端网站开发的区别国内设计师个人网站欣赏
  • 抽奖机网站怎么做的不用付费的正能量软件
  • Excel——常用函数二
  • 3- 十大排序算法(基数排序、归并排序、快速排序、堆排序)
  • 数码设备存储新搭档 金士顿Select Plus存储卡
  • 好的设计师网站有哪些什么是seo营销
  • pytorch 线性回归
  • 推荐做问卷的网站产品设计方案3000字
  • 商务网站规划建设与管理试卷公众号开发信息什么意思
  • ACE无法启动,腾讯游戏反作弊器无法启动,ACE无法运行,软件无法运行,本次操作由于计算机限制而被取消、请与系统管理员联系
  • golang基础语法(四) 数组
  • 开源手机网站模板刚做的网站为什么百度搜不到
  • 云锁客户端连不上服务器处理
  • 网站建设优化服务熊掌号网站怎么显示百度名片
  • LNMP架构(分离部署)PHP与数据库交互示例
  • Git----常用指令入门
  • 传输无界 金士顿双接口U盘上新抽电脑
  • Real-Time MDNet
  • 从零开始:接入suno api V5.0模型:认识 Suno AI音乐 - 第1篇
  • wordpress成品图开封做网站优化
  • 陕西省住房建设厅官方网站开发软件需要多少成本
  • 软硬件基本相同的两个设备,AE表现不一致的原因定位
  • 湖南网站开发公司电话网络设计与制作
  • 天数智芯智铠100性能测试
  • datawhale玩转通义四大新模型 202509 第6次作业
  • 响应式品牌网站wordpress图片文字