当前位置: 首页 > 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.zskr.cn/news/19518.html

相关文章:

  • AI圈每日技术学习---紧跟时代脚步(N8n工作流)
  • 2025宿舍上下床厂家权威推荐榜:耐用设计与空间优化口碑之选
  • 2025厂房恒温恒湿设备厂家权威推荐榜:精准控温与节能技术深
  • 面向对象编程实验一
  • ABC 427 EF
  • SHA256文件完整性校验
  • 接口导入 jmeter
  • 备考笔记1
  • 完整教程:今日面试之快问快答:Redis篇
  • 脚本方式安装Python 特定版本
  • 数据结构-单向循环链表
  • 2025高频超声波检测设备厂家权威推荐榜:精准检测与技术创新
  • HEU KMS Activator最新功能使用教程及介绍,附HEU KMS Activator最新版下载
  • PWN手的成长之路-14-ciscn_2019_c_1-ret2libc
  • 国内高速下载镜像
  • 2025数控高速滚齿机厂家权威推荐榜:精密加工与高效产能标杆
  • 2025年10月工作服厂家最新推荐排行榜,春夏秋冬季工作服,工人工作服,车间工作服,防静电工作服公司推荐!
  • 2023-网鼎杯web-thinkshop
  • 2025活性氧化镁厂家最新权威推荐榜:高纯度与稳定性能深度解
  • 通用寄存器, 与RAM寄存器的内存关系
  • C++20中线程类std::jthread的使用 - 详解
  • 2025年CNC高压清洗机厂家权威推荐:高效清洁与耐用性能深
  • C# NUnit
  • GJB 438C学习
  • typora markdown
  • MySQL数据库连接过多(Too many connections)错误处理策略
  • [Python] Python配置uv环境
  • Spring Boot 基础教程 - 指南
  • Linux系统监控报告CPU软锁定问题(soft lockup)诊断方法
  • Java语言操作INI配置文件策略