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

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

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

文章目录

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

摘要

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

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

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

描述

题目要求:

举几个例子:

题解答案

最直观的想法:

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

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

题解代码分析

下面是 Swift 实现:

import Foundation
class 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),满足要求。

空间复杂度

总结

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

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

它的思路非常清晰:

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

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

http://www.jsqmd.com/news/12208/

相关文章:

  • 详细介绍:基于微信小程序的智能在线预约挂号系统【2026最新】
  • 让我们开始 CSS 的学习之旅
  • 2025液压无损扒胎机厂家权威推荐榜:高效无损与耐用性能深度
  • Linux环境下的UDEV机制及其与守护进程的关联
  • 在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
  • [转] 基于ubuntu-base进行根文件系统的修改与打包
  • jquery 字符串转数字
  • AI圈每日技术学习---紧跟时代脚步(N8n工作流)
  • B -识别浮点常量问题
  • 小C语言--词法分析程序-A
  • 查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
  • IS-IS核心解析:驱动现代网络的隐形力量 - 教程
  • 梳理一下Java中为保证线程安全提供了那些方案 - 浪矢
  • 处理Git错误:“invalid object [hash]”和“unable to read tree [hash]”
  • 2025厂房恒温恒湿设备厂家权威推荐榜:精准控温与节能技术深
  • ABC 427 EF
  • SHA256文件完整性校验
  • 基于OpenEuler--docker容器化部署ceph集群 - 实践
  • 接口导入 jmeter
  • 深入理解MySQL的MVCC(多版本并发控制)实现原理
  • Kubernetes环境下Nginx代理Nacos服务请求故障诊断
  • 备考笔记1
  • 2025年新型振动电机厂家权威推荐榜:创新技术与高效性能深度
  • 完整教程:今日面试之快问快答:Redis篇
  • SSL/TLS协议如何确保HTTP通信的安全
  • 2025钢衬塑储罐厂家最新权威推荐榜:耐腐性能与结构强度双优
  • 2023-网鼎杯web-platfrom
  • 区分iBatis与MyBatis:两个Java数据库框架的比较
  • 2025大棕拉链厂家权威推荐榜:品质工艺与创新设计深度解析
  • JavaScript加密与解密技术:Hook技术应用案例分析