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

简单题——力扣387.字符串中的第一个唯一字符

力扣387.字符串中的第一个唯一字符
在这里插入图片描述


【LeetCode 387】字符串中的第一个唯一字符

一、题目描述

给定一个字符串 s,找到它的第一个不重复的字符,并返回它的下标。
如果不存在这样的字符,则返回 -1


示例

示例 1:

输入:s = "leetcode"
输出:0
解释:字符 'l' 在字符串中只出现一次,且下标为 0。

示例 2:

输入:s = "loveleetcode"
输出:2
解释:第一个只出现一次的字符是 'v',下标为 2。

示例 3:

输入:s = "aabb"
输出:-1
解释:字符串中没有不重复的字符。

提示

  • 1 <= s.length <= 10⁵
  • s 只包含小写字母

二、思路分析

这道题的核心在于:

  1. 找出哪些字符出现了 一次
  2. 按字符串的 顺序 找到第一个这样的字符。

由于字符串只包含小写字母,我们可以用数组或哈希表高效统计。


三、方法一:使用哈希表统计频率(推荐写法)

思路步骤

  1. 第一次遍历字符串,用哈希表统计每个字符的出现次数。
  2. 第二次遍历字符串,找到第一个出现次数为 1 的字符,返回其索引。
  3. 如果不存在,返回 -1。

时间复杂度:O(n)
空间复杂度:O(1)(因为只有 26 个字母)


代码实现

class Solution {public int firstUniqChar(String s) {int[] count = new int[26];for (char c : s.toCharArray()) {count[c - 'a']++;}for (int i = 0; i < s.length(); i++) {if (count[s.charAt(i) - 'a'] == 1) {return i;}}return -1;}
}

代码解析

  • count[c - 'a'] 用于记录字母 c 出现的次数;
  • 第二次遍历时,找到第一个出现次数为 1 的字符;
  • 由于是顺序遍历,保证返回的是“第一个唯一字符”。

四、方法二:使用 HashMap(适合扩展到任意字符)

如果字符串不止包含小写字母,可以使用 HashMap<Character, Integer>

实现代码

import java.util.HashMap;
import java.util.Map;class Solution {public int firstUniqChar(String s) {Map<Character, Integer> map = new HashMap<>();for (char c : s.toCharArray()) {map.put(c, map.getOrDefault(c, 0) + 1);}for (int i = 0; i < s.length(); i++) {if (map.get(s.charAt(i)) == 1) {return i;}}return -1;}
}

优点

  • 更通用,可扩展到任意 Unicode 字符;
  • 思路清晰,适合初学者理解。

缺点

  • 相比数组,HashMap 占用的空间和时间开销略高。

五、方法三:利用字符 API 优化写法(简洁但效率略低)

Java 的 String.indexOf()String.lastIndexOf() 方法可以用来判断字符是否唯一。

代码实现

class Solution {public int firstUniqChar(String s) {for (int i = 0; i < s.length(); i++) {if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i))) {return i;}}return -1;}
}

复杂度分析

  • 每次 indexOflastIndexOf 都是 O(n),整体 O(n²)。
  • 对于 1e5 级别的字符串会超时,因此只推荐在字符串很短时使用。

六、方法对比总结

方法思路时间复杂度空间复杂度适用场景
方法一数组计数O(n)O(1)最推荐(仅小写字母)
方法二HashMap 计数O(n)O(n)任意字符情况
方法三字符 API 判断O(n²)O(1)简短字符串或快速实现

七、结论

最优解为方法一:使用长度为 26 的数组统计字符频率。
时间复杂度 O(n),空间复杂度 O(1),实现简单高效。

最终推荐代码:

class Solution {public int firstUniqChar(String s) {int[] count = new int[26];for (char c : s.toCharArray()) {count[c - 'a']++;}for (int i = 0; i < s.length(); i++) {if (count[s.charAt(i) - 'a'] == 1) {return i;}}return -1;}
}
http://www.dtcms.com/a/461711.html

相关文章:

  • 商务网站开发设计结论浦江网站建设微信开发
  • 网站建站所用的技术国内新闻最新消息10条简短2022
  • FGFR信号通路与肿瘤治疗:基因变异、检测及临床应用
  • 2025 年山西省职业院校技能大赛应用软件系统开发赛项竞赛规程(学生组)
  • Unity插件-unity-webview跨平台WebView浏览器组件
  • LeetCode-704-二分查找
  • 老题新解|大整数加法
  • 常见python 排序
  • windows安装claude踩到的坑
  • 专业外贸网站建设公司价格深圳谷歌seo推广
  • 为什么需求文档总是不完整,有哪些解法
  • 88-python电网可视化项目-8-2
  • 计算机专业可考证书汇总及建议
  • 爱站网是干嘛的网站建设中 页面
  • 【agent】AI 数字人构建2:MDM与MNN
  • 配电安全“隐形哨兵”上线!RCMX-ONE剩余电流监视器,守护每一度电的安心
  • 视频封面制作网站wordpress怎么考别人的
  • 专做眼镜的网站临城网络营销怎么做
  • Oracle VirtualBox异常关闭后无法启动解决办法
  • 微信小程序开发从零基础到项目发布的全流程实战教程(五)
  • 边缘计算双雄:CDN与PCDN
  • LeetCode 面试经典 150_哈希表_存在重复元素 II(46_219_C++_简单)
  • 网站2个页面做首页广元 网站建设
  • HTML应用指南:利用POST请求获取全国中信银行网点位置信息
  • 加油站小程序上线即闲置?3 大核心功能 + 运营落地策略
  • 做淘宝客导购网站宁夏百度公司
  • 使用 Flask 实现本机 PyTorch 模型部署:从服务端搭建到客户端调用
  • sql题目练习——多表查询
  • c 做网站加载多个图片网站开发实战第二章
  • 精通C语言(3. 自定义类型:联合体和枚举)