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

【OJ题解】在字符串中查找第一个不重复字符的索引

💵个人主页: 起名字真南
💵个人专栏:【数据结构初阶】 【C语言】 【C++】 【OJ题解】

请添加图片描述

目录

  • 1. 引言
  • 2. 题目分析
    • 示例:
  • 3. 解题思路
    • 思路一:双重循环
    • 思路二:哈希表
  • 4. C++代码实现
  • 5. 代码详解
  • 6. 时间和空间复杂度分析
  • 7. 优化方法
    • 使用哈希表优化的思路:
  • 8. 时间和空间复杂度分析(哈希表实现)
  • 9. 总结

1. 引言

在字符串处理相关问题中,查找第一个不重复字符的索引是一个经典题目。特别是在高并发环境中,我们可能需要高效判断某个字符串的字符是否有重复。本文将详细解析如何在给定字符串中找到第一个不重复字符的索引。

2. 题目分析

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

在字符串中查找第一个不重复字符的索引题目链接

示例:

  • 示例 1:
    • 输入:s = "leetcode"
    • 输出:0(因为第一个不重复字符是 l,索引为 0)
  • 示例 2:
    • 输入:s = "loveleetcode"
    • 输出:2(第一个不重复字符是 v,索引为 2)
  • 示例 3:
    • 输入:s = "aabb"
    • 输出:-1(所有字符都重复)

3. 解题思路

这道题可以通过双重循环哈希表两种思路来实现。双重循环简单直接,但在处理大型字符串时效率较低。本文将以双重循环方法为主,之后讨论优化方法。

思路一:双重循环

我们逐个检查字符串中的每个字符,并在整个字符串中寻找其他相同字符。若发现相同字符,则跳过;否则,返回该字符的索引。

思路二:哈希表

可以用哈希表记录每个字符出现的次数。之后再遍历字符串,查找第一个只出现一次的字符。

4. C++代码实现

以下为C++代码,使用双重循环来实现第一个不重复字符的查找:

class Solution {
public:int firstUniqChar(string s) {int len = s.size();// 遍历字符串中的每个字符for (int i = 0; i < len; i++) {bool isUnique = true; // 假设当前字符是唯一的for (int j = 0; j < len; j++) {// 检查是否有其他相同字符if (s[i] == s[j] && i != j) {isUnique = false;break;}}// 如果是唯一字符,返回其索引if (isUnique) {return i;}}return -1; // 没有找到不重复字符}
};

5. 代码详解

  • 外层循环:遍历字符串中的每一个字符 s[i],并假设该字符是唯一的。
  • 内层循环:检查 s[i] 是否在其他位置出现:
    • 如果找到与 s[i] 相同的字符,则将 isUnique 标记为 false,并跳出内层循环。
  • 返回索引:如果 isUnique 仍然为true,表示当前字符是唯一的,返回它的索引i
  • 返回-1:如果遍历结束没有找到不重复字符,返回 -1

6. 时间和空间复杂度分析

  • 时间复杂度:O(n^2),其中 n 是字符串的长度。外层循环遍历字符串中的每个字符,内层循环遍历整个字符串来寻找重复字符,因此时间复杂度为 O(n^2)。
  • 空间复杂度:O(1),仅使用了常数级额外空间。

7. 优化方法

尽管双重循环方法简单易懂,但在长字符串中效率较低。可以使用哈希表优化到线性时间复杂度。

使用哈希表优化的思路:

  1. 首次遍历字符串,将每个字符的出现次数记录到哈希表中。
  2. 再次遍历字符串,找到第一个只出现一次的字符并返回其索引。

优化后的代码如下:

#include <unordered_map>class Solution {
public:int firstUniqChar(string s) {unordered_map<char, int> countMap;// 统计每个字符出现的次数for (char c : s) {countMap[c]++;}// 再次遍历字符串,找到第一个只出现一次的字符for (int i = 0; i < s.size(); i++) {if (countMap[s[i]] == 1) {return i;}}return -1;}
};

8. 时间和空间复杂度分析(哈希表实现)

  • 时间复杂度:O(n),因为哈希表方法只需要两次遍历字符串。
  • 空间复杂度:O(1),因为哈希表中的键值对不会超过字符数量。

9. 总结

本文介绍了如何查找字符串中第一个不重复字符的索引。虽然双重循环方法能有效解决问题,但在大型数据下不够高效。哈希表优化方法可以大幅提升效率,适用于各种字符串长度。希望通过此文章能帮助大家更好地理解字符串不重复字符查找的实现。

今后可以探索更多优化方法,如基于字符ASCII码的统计数组,以实现更快的查找操作。

相关文章:

【OJ题解】在字符串中查找第一个不重复字符的索引

&#x1f4b5;个人主页: 起名字真南 &#x1f4b5;个人专栏:【数据结构初阶】 【C语言】 【C】 【OJ题解】 目录 1. 引言2. 题目分析示例&#xff1a; 3. 解题思路思路一&#xff1a;双重循环思路二&#xff1a;哈希表 4. C代码实现5. 代码详解6. 时间和空间复杂度分析7. 优化方…...

处理配对和拆分内容 |【python技能树知识点1~2 习题分析】

目录 一、编程语言简史&#xff08;配对&#xff09;题目要求&#xff1a;程序设计&#xff1a; 二、 编程语言发明家&#xff08;拆分&#xff09;题目要求程序实现while和for循环 python技能树知识点中的一些习题练习和分析。熟悉python编程模式和逻辑。 一、编程语言简史&am…...

HBuilderX自定义Vue3页面模版

HBuilderX自定义Vue3页面模版 首先在HBuilderX工具下的任意一个项目添加新建自定义页面模版 新建模版文件&#xff0c;并打开进行编辑 vue3-setup-js.vue文件里填写样式模版&#xff08;根据自己的需要进行修改&#xff09; <template><view class"">&…...

计算机网络——TCP中的流量控制和拥塞控制

TCP中的流量控制和拥塞控制 流量控制 什么是流量控制 如果发送者发送数据过快&#xff0c;接收者来不及接收&#xff0c;那么就会出现分组丢失&#xff0c;为了避免分组丢失&#xff0c;控制发送者的发送速度&#xff0c;使得接收者来得及接收&#xff0c;这就是流量控制。 …...

BFV/BGV全同态加密方案浅析

本文主要为翻译内容&#xff0c;原文地址&#xff1a;Introduction to the BFV encryption scheme、https://www.inferati.com/blog/fhe-schemes-bgv 之前的一篇博客我们翻译了CKKS全同态加密方案的内容&#xff0c;但该篇上下文中有一些知识要点&#xff0c;作者在BFV/BGV中已…...

Elasticsearch 实战应用详解!

Elasticsearch 实战应用详解 一、概述 Elasticsearch 是一个高度可扩展的开源全文搜索引擎&#xff0c;它能够处理大量数据并提供实时搜索和分析能力。基于 Lucene 构建&#xff0c;Elasticsearch 通过简单的 RESTful API 接口隐藏了 Lucene 的复杂性&#xff0c;使全文搜索变…...

最新最全面的JAVA面试题免费下载

面对求职市场的激烈竞争&#xff0c;掌握全面且深入的Java知识已成为每一位Java开发者必不可少的技能。《2023最新版Java面试八股文》是一份精心整理的面试准备资料&#xff0c;旨在帮助广大开发者系统复习&#xff0c;从容应对Java及相关技术栈的面试挑战。这份文档不仅汇聚了…...

修改sql server 数据库的排序规则

文章目录 引言I 解决方案案例II 知识扩展排序规则SQL SERVER支持的所有排序规则引言 新增sql server 数据库实例的默认排序规则不支持中文存储,导致乱码 解决方案: 修改排序规则为Chinese_PRC_CI_AS 或者 Chinese_PRC_Stroke_CI_AS_WS或者Chinese_PRC_CI_AI_KS_WS 仅对新增…...

Node学习记录-until实用工具

来源&#xff1a;Nodejs 第十八章&#xff08;util&#xff09; util 是Node.js内部提供的很多实用或者工具类型的API util.promisify 用于将遵循Node回调风格&#xff08;即最后一个参数为回调函数&#xff09;的函数转换成返回Promise的函数&#xff0c;这样可以使得异步代…...

【Mac】安装 VMware Fusion Pro

VMware Fusion Pro 软件已经正式免费提供给个人用户使用&#xff01; 1、下载 【官网】 下拉找到 VMware Fusion Pro Download 登陆账号 如果没有账号&#xff0c;点击右上角 LOGIN &#xff0c;选择 REGISTER 注册信息除了邮箱外可随意填写 登陆时&#xff0c;Username为…...

解决go run main.go executable file not found in %PATH%

项目场景&#xff1a; 命令行执行go run 都会报 executable file not found in %PATH% 问题描述 最近我发现&#xff0c;我通过命令行&#xff0c;无论是跑什么go文件&#xff0c;都会出现这个错误。但是我通过我的IDE就能跑&#xff0c;于是我也没有管它。 但是最近&#x…...

C++ 手写常见的任务定时器

序言 最近在编写 C 的服务器代码时&#xff0c;我遇到了一个需求&#xff0c;服务器很可能会遇到那些长期不活跃的连接&#xff0c;这些连接占用了一定的资源但是并没有进行有效的通信。为了优化资源使用&#xff0c;我决定实现一个定时器&#xff0c;以便定期检查连接的活跃状…...

【VS+QT】联合开发踩坑记录

最新更新日期&#xff1a;2024/11/05 0. 写在前面 因为目前在做自动化产线集成软件开发相关的工作&#xff0c;需要用到QT&#xff0c;所以选择了VS联合开发&#xff0c;方便调试。学习QT的过程中也踩了很多坑&#xff0c;在此记录一下&#xff0c;提供给各位参考。 1. 环境配…...

PH热榜 | 2024-11-05

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 Github&#xff1a;https://github.com/LaughingZhu/DevNow 1. FullContext 标语&#xff1a;用自然语言&#xff0c;让你的市场推广流…...

模拟机器人逐字回答,类似于实时回话

代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><…...

Java学习路线:JUL日志系统(一)日志框架介绍

目录 打印日志 日志的级别 打印文件 日志过滤器 日志输出流程 首先&#xff0c;为什么要使用日志系统&#xff1f; 如果单纯地用System.out.println打印信息&#xff0c;如果项目比较大&#xff0c;存在大量的信息就会显得非常凌乱。 而且&#xff0c;当我们希望在debug的…...

[渲染层网络层错误] net::ERR_CONTENT_LENGTH_MISMATCH 问题解决

问题描述 问题背景 微信小程序访问后端img资源的时候&#xff0c;偶尔出现这个感叹号&#xff0c;图片加载不出来&#xff0c;但是对应的url贴出来在浏览器中访问&#xff0c;或者重新加载是可以访问的。 错误描述 经查询前端报错 [渲染层网络层错误] net::ERR_CONTENT_LE…...

C 语言编程中的常见错误及解决方案

在 C 语言开发中&#xff0c;编译和链接错误是常见的问题&#xff0c;尤其是在处理多个源文件时。本文将总结一些常见的错误&#xff0c;并提供相应的解决方案&#xff0c;以帮助开发者更高效地排查和修复这些问题。 1. 结构体作用域问题 问题描述 在函数参数列表中定义结构体…...

开源模型应用落地-glm模型小试-glm-4-9b-chat-批量推理(二)

一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型&#xff0c;旨在自动理解和规划用户的复杂指令&#xff0c;并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等&#xff0c;支持128K的上下文窗口&#xff0c;使其在长文本处理和精度召回方面表现优异&a…...

【C++篇】数据之林:解读二叉搜索树的优雅结构与运算哲学

文章目录 二叉搜索树详解&#xff1a;基础与基本操作前言第一章&#xff1a;二叉搜索树的概念1.1 二叉搜索树的定义1.1.1 为什么使用二叉搜索树&#xff1f; 第二章&#xff1a;二叉搜索树的性能分析2.1 最佳与最差情况2.1.1 最佳情况2.1.2 最差情况 2.2 平衡树的优势 第三章&a…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...