💎一、题目
🏆1.题目描述
字符串中的第一个唯一字符
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。示例 1:
输入: s = “leetcode” 输出: 0
示例 2:输入: s = “loveleetcode” 输出: 2
示例 3:输入: s = “aabb” 输出: -1
提示:
1 <= s.length <= 105 s 只包含小写字母
🏆2.原题链接
提示:题目链接放这里
💎二、解题报告
🏆1.思路分析
🔑思路:hash
对字符串进行两次遍历。
在第一次遍历时,我们使用哈希映射统计出字符串中每个字符出现的次数。在第二次遍历时,我们只要遍历到了一个只出现一次的字符,那么就返回它的索引,否则在遍历结束后返回−1。
🏆2.代码详解
//暴力查找
class Solution {
public:
int firstUniqChar(string s) {
int j;
for(int i=0;i<s.size();++i)
{
for(j=0;j<s.size();j++)
{
if(i==j)continue;
if(s[i]==s[j])break;
}
if(j>=s.size())return i;
}
return -1;
}
};
执行结果: 通过 显示详情 添加备注
执行用时: 64 ms , 在所有 C++ 提交中击败了
7.99% 的用户 内存消耗:
10.3 MB , 在所有 C++ 提交中击败了
88.50% 的用户 通过测试用例: 105 / 105
//哈希法
class Solution {
public:
int firstUniqChar(string s) {
int hash[255]={0};
for(int i=0;i<s.size();++i)
hash[s[i]]++;
for(int j=0;j<s.size();++j)
if(hash[s[j]]==1)return j;
return -1;
};
};
执行结果:通过 显示详情 添加备注
执行用时: 12 ms , 在所有 C++ 提交中击败了
98.08% 的用户 内存消耗:
10.3 MB , 在所有 C++ 提交中击败了
87.93% 的用户 通过测试用例: 105 / 105
//双向查找
class Solution {
public:
int firstUniqChar(string s) {
for(int i=0;i<s.size();++i)
{
int a=s.find(s[i]);
int b=s.rfind(s[i]);
if(a==b)return i;
}
return -1;
};
};
执行结果: 通过 显示详情 添加备注
执行用时: 24 ms , 在所有 C++ 提交中击败了
71.34% 的用户 内存消耗:
10.4 MB , 在所有 C++ 提交中击败了
75.39% 的用户 通过测试用例: 105 / 105