LeetCode题练习与总结:字符串中的第一个唯一字符--387

ops/2024/11/14 22:49:31/

一、题目描述

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

示例 1:

输入: s = "leetcode"
输出: 0

示例 2:

输入: s = "loveleetcode"
输出: 2

示例 3:

输入: s = "aabb"
输出: -1

提示:

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

二、解题思路

  1. 创建一个长度为26的整型数组,用于记录每个字符出现的次数。数组的索引对应字符 ‘a’ 到 ‘z’。
  2. 遍历字符串,对于每个字符,将其在数组中的对应位置加1。
  3. 再次遍历字符串,对于每个字符,检查其在数组中的对应位置的值是否为1,如果是,则返回当前字符的索引。
  4. 如果遍历完字符串后,没有找到只出现一次的字符,返回-1。

三、具体代码

class Solution {public int firstUniqChar(String s) {// 创建一个长度为26的数组,初始化为0int[] charCount = new int[26];// 遍历字符串,记录每个字符出现的次数for (int i = 0; i < s.length(); i++) {charCount[s.charAt(i) - 'a']++;}// 再次遍历字符串,找到第一个出现一次的字符for (int i = 0; i < s.length(); i++) {if (charCount[s.charAt(i) - 'a'] == 1) {return i; // 返回该字符的索引}}// 如果没有找到,返回-1return -1;}
}

这段代码首先通过两个循环来记录和检查字符的出现次数,第一个循环用于统计每个字符出现的次数,第二个循环用于找到第一个只出现一次的字符。如果找到了,就返回它的索引;如果遍历结束后都没有找到,则返回-1。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 第一个循环用于遍历字符串 s,其长度为 n字符串的长度)。在这个循环中,我们执行了 n 次操作(每次操作都是常数时间复杂度,即 O(1)),因此第一个循环的时间复杂度是 O(n)。

  • 第二个循环也是遍历字符串 s,同样执行了 n 次操作。因此,第二个循环的时间复杂度也是 O(n)。

  • 两个循环是顺序执行的,所以总的时间复杂度是两个循环的时间复杂度之和,即 O(n) + O(n) = O(n)。

2. 空间复杂度
  • 我们创建了一个固定大小的整型数组 charCount,其大小为 26,这是因为英文字母表中有26个小写字母。这个数组的大小与输入字符串的长度无关,因此空间复杂度是 O(1)。

五、总结知识点

  1. 类定义:定义了一个名为 Solution 的公共类。

  2. 方法定义:在类中定义了一个公共方法 firstUniqChar,该方法接受一个字符串参数 s 并返回一个整数。

  3. 数组初始化:使用 new int[26] 创建了一个整型数组 charCount,长度为26,用于存储每个小写字母出现的次数。

  4. 字符与整数的转换:使用 s.charAt(i) - 'a' 将字符转换为对应的整数索引。这是因为字符 ‘a’ 到 ‘z’ 在 ASCII 表中是连续的,所以减去 ‘a’ 的 ASCII 值可以得到一个从 0 到 25 的索引。

  5. 数组操作:通过 charCount[s.charAt(i) - 'a']++ 来增加数组中对应字符的计数

  6. 循环结构:使用了两个 for 循环,第一个循环用于遍历字符串并统计字符出现次数,第二个循环用于找到第一个只出现一次的字符。

  7. 条件判断:使用 if 语句检查数组中特定索引的值是否等于1,以确定该字符是否只出现一次。

  8. 方法返回值:使用 return 语句返回找到的第一个不重复字符的索引,或者如果没有找到则返回 -1

  9. 字符串长度:使用 s.length() 获取字符串的长度。

  10. 常量:在代码中使用了常量 -1 作为找不到不重复字符时的返回值。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。


http://www.ppmy.cn/ops/133699.html

相关文章

如何在 Spring Boot 中启用定时任务

添加 EnableScheduling 注解 可以添加在 Application 类上 SpringBootApplication EnableScheduling public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} }定义定时任务类和方法 定时任务类要注册为Spri…

攻防世界37-unseping-CTFWeb

攻防世界37-unseping-CTFWeb <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("…

【IC每日一题:IC验证面试--UVM验证-2】

IC每日一题&#xff1a;IC验证面试--UVM验证-2 2.9 get_next_iterm()和try_next_item()的区别&#xff1f;2.10 一个典型的UVM验证平台&#xff0c;谈一下UVM验证环境结构&#xff0c;各个组件之间的关系&#xff1f;2.11 uvm组件之间通信的方式&#xff1f; analysis_port和其…

基于STM32的LCD1602显示Proteus仿真设计(仿真+程序+设计报告+讲解视频)

这里写目录标题 1.主要功能0. 资料清单&下载链接资料下载链接&#xff1a;2.仿真设计3. 程序设计4. 设计报告5. 框图 基于STM32的LCD1602显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a…

【Android】View—基础知识,滑动,弹性滑动

基础知识 什么是View 在 Android 中&#xff0c;View 是用户界面&#xff08;UI&#xff09;中的基本组件&#xff0c;用于绘制图形和处理用户交互。所有的 UI 组件&#xff08;如按钮、文本框、图片等&#xff09;都是 View 的子类。可以说&#xff0c;View 是构建 Android …

在jquery里,使用$.each()函数循环数组,对象,dom的用法

介绍 $.each() 能遍历一维数组&#xff0c;多维数组&#xff0c;JSON对象&#xff0c;dom2元素。在开发中可以很高效的处理各种数据结构。前提&#xff0c;需要导入jquery 使用 遍历JSON对象 var objDemo {name: linda,age:12, desc: a girl};$.each(objDemo,function(i,va…

小程序开发进阶之路-AI编程助手

之前&#xff0c;我独自一人开发了一个名为“心情追忆”的小程序&#xff0c;旨在帮助用户记录日常的心情变化及重要时刻。从项目的构思、设计、前端&#xff08;小程序&#xff09;开发、后端搭建到最终部署&#xff0c;所有环节都由我一人包办。经过一个月的努力&#xff0c;…

MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中

MySQL技巧之跨服务器数据查询&#xff1a;高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中 基础篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的…