content_views"
c lass="markdown_views prism-tomorrow-night">
cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-bloc k" style="-webkit-tap-highlight-c olor: rgba(0, 0, 0, 0);">
💵个人主页: 起名字真南 💵个人专栏:【数据结构初阶】 【C语言】 【C++】 【OJ题解】
c="https://i-blog.c sdnimg.c n/direc t/69fd2d5f461d4d94b24b6a5799c ae5c 8.gif#pic _c enter" alt="请添加图片描述" />
1. 引言
ckquote>
在字符串处理相关问题中c ;查找第一个不重复字符的索引是一个经典题目。特别是在高并发环境中c ;我们可能需要高效判断某个字符串的字符是否有重复。本文将详细解析如何在给定字符串中找到第一个不重复字符的索引。
ckquote>
2. 题目分析
给定一个字符串 <c ode>sc ode>c ;需要找到第一个不重复字符的索引。如果不存在不重复字符c ;则返回 <c ode>-1c ode>。
在字符串中查找第一个不重复字符的索引题目链接
示例:
示例 1:
输入:<c ode>s = "c lass="tags" href="/tags/LEETCODE.html" title=leetc ode>leetc ode"c ode> 输出:<c ode>0c ode>(因为第一个不重复字符是 <c ode>lc ode>c ;索引为 0) 示例 2:
输入:<c ode>s = "lovec lass="tags" href="/tags/LEETCODE.html" title=leetc ode>leetc ode"c ode> 输出:<c ode>2c ode>(第一个不重复字符是 <c ode>vc ode>c ;索引为 2) 示例 3:
输入:<c ode>s = "aabb"c ode> 输出:<c ode>-1c ode>(所有字符都重复)
3. 解题思路
这道题可以通过双重循环 和哈希表 两种思路来实现。双重循环简单直接c ;但在处理大型字符串时效率较低。本文将以双重循环方法为主c ;之后讨论优化方法。
思路一:双重循环
我们逐个检查字符串中的每个字符c ;并在整个字符串中寻找其他相同字符。若发现相同字符c ;则跳过;否则c ;返回该字符的索引。
思路二:哈希表
可以用哈希表记录每个字符出现的次数。之后再遍历字符串c ;查找第一个只出现一次的字符。
4. C++代码实现
以下为C++代码c ;使用双重循环来实现第一个不重复字符的查找:
<c ode c lass="prism language-c pp">class="token keyword">c lass class="token c lass-name">Solution class="token punc tuation">{
class="token keyword">public class="token operator">:
class="token keyword">int class="token func tion">firstUniqChar class="token punc tuation">( string sclass="token punc tuation">) class="token punc tuation">{
class="token keyword">int len class="token operator">= sclass="token punc tuation">. class="token func tion">size class="token punc tuation">( class="token punc tuation">) class="token punc tuation">;
class="token c omment">// 遍历字符串中的每个字符
class="token keyword">for class="token punc tuation">( class="token keyword">int i class="token operator">= class="token number">0 class="token punc tuation">; i class="token operator">< lenclass="token punc tuation">; iclass="token operator">++ class="token punc tuation">) class="token punc tuation">{
class="token keyword">bool isUnique class="token operator">= class="token boolean">true class="token punc tuation">; class="token c omment">// 假设当前字符是唯一的
class="token keyword">for class="token punc tuation">( class="token keyword">int j class="token operator">= class="token number">0 class="token punc tuation">; j class="token operator">< lenclass="token punc tuation">; jclass="token operator">++ class="token punc tuation">) class="token punc tuation">{
class="token c omment">// 检查是否有其他相同字符
class="token keyword">if class="token punc tuation">( sclass="token punc tuation">[ iclass="token punc tuation">] class="token operator">== sclass="token punc tuation">[ jclass="token punc tuation">] class="token operator">&& i class="token operator">!= jclass="token punc tuation">) class="token punc tuation">{
isUnique class="token operator">= class="token boolean">false class="token punc tuation">;
class="token keyword">break class="token punc tuation">;
class="token punc tuation">}
class="token punc tuation">}
class="token c omment">// 如果是唯一字符c ;返回其索引
class="token keyword">if class="token punc tuation">( isUniqueclass="token punc tuation">) class="token punc tuation">{
class="token keyword">return iclass="token punc tuation">;
class="token punc tuation">}
class="token punc tuation">}
class="token keyword">return class="token operator">- class="token number">1 class="token punc tuation">; class="token c omment">// 没有找到不重复字符
class="token punc tuation">}
class="token punc tuation">} class="token punc tuation">;
c ode>
5. 代码详解
外层循环 :遍历字符串中的每一个字符 <c ode>s[i]c ode>c ;并假设该字符是唯一的。内层循环 :检查 <c ode>s[i]c ode> 是否在其他位置出现:
如果找到与 <c ode>s[i]c ode> 相同的字符c ;则将 <c ode>isUniquec ode> 标记为 <c ode>falsec ode>c ;并跳出内层循环。 返回索引 :如果 <c ode>isUniquec ode> 仍然为<c ode>truec ode>c ;表示当前字符是唯一的c ;返回它的索引<c ode>ic ode>。返回-1 :如果遍历结束没有找到不重复字符c ;返回 <c ode>-1c ode>。
6. 时间和空间复杂度分析
时间复杂度 :O(n^2)c ;其中 <c ode>nc ode> 是字符串的长度。外层循环遍历字符串中的每个字符c ;内层循环遍历整个字符串来寻找重复字符c ;因此时间复杂度为 O(n^2)。空间复杂度 :O(1)c ;仅使用了常数级额外空间。
7. 优化方法
尽管双重循环方法简单易懂c ;但在长字符串中效率较低。可以使用哈希表优化到线性时间复杂度。
使用哈希表优化的思路:
首次遍历字符串c ;将每个字符的出现次数记录到哈希表中。 再次遍历字符串c ;找到第一个只出现一次的字符并返回其索引。
优化后的代码如下:
<c ode c lass="prism language-c pp">class="token mac ro property">class="token direc tive-hash"># class="token direc tive keyword">inc lude class="token string"><unordered_map>
class="token keyword">c lass class="token c lass-name">Solution class="token punc tuation">{
class="token keyword">public class="token operator">:
class="token keyword">int class="token func tion">firstUniqChar class="token punc tuation">( string sclass="token punc tuation">) class="token punc tuation">{
unordered_mapclass="token operator">< class="token keyword">c har class="token punc tuation">, class="token keyword">int class="token operator">> c ountMapclass="token punc tuation">;
class="token c omment">// 统计每个字符出现的次数
class="token keyword">for class="token punc tuation">( class="token keyword">c har c class="token operator">: sclass="token punc tuation">) class="token punc tuation">{
c ountMapclass="token punc tuation">[ c class="token punc tuation">] class="token operator">++ class="token punc tuation">;
class="token punc tuation">}
class="token c omment">// 再次遍历字符串c ;找到第一个只出现一次的字符
class="token keyword">for class="token punc tuation">( class="token keyword">int i class="token operator">= class="token number">0 class="token punc tuation">; i class="token operator">< sclass="token punc tuation">. class="token func tion">size class="token punc tuation">( class="token punc tuation">) class="token punc tuation">; iclass="token operator">++ class="token punc tuation">) class="token punc tuation">{
class="token keyword">if class="token punc tuation">( c ountMapclass="token punc tuation">[ sclass="token punc tuation">[ iclass="token punc tuation">] class="token punc tuation">] class="token operator">== class="token number">1 class="token punc tuation">) class="token punc tuation">{
class="token keyword">return iclass="token punc tuation">;
class="token punc tuation">}
class="token punc tuation">}
class="token keyword">return class="token operator">- class="token number">1 class="token punc tuation">;
class="token punc tuation">}
class="token punc tuation">} class="token punc tuation">;
c ode>
8. 时间和空间复杂度分析(哈希表实现)
时间复杂度 :O(n)c ;因为哈希表方法只需要两次遍历字符串。空间复杂度 :O(1)c ;因为哈希表中的键值对不会超过字符数量。
9. 总结
本文介绍了如何查找字符串中第一个不重复字符的索引。虽然双重循环方法能有效解决问题c ;但在大型数据下不够高效。哈希表优化方法可以大幅提升效率c ;适用于各种字符串长度。希望通过此文章能帮助大家更好地理解字符串不重复字符查找的实现。
今后可以探索更多优化方法c ;如基于字符ASCII码的统计数组c ;以实现更快的查找操作。