题目
LeetCode:387. 字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
案例:
s = “leetcode”
返回 0.
s = “loveleetcode”,
返回 2.
注意事项:您可以假定该字符串只包含小写字母。
代码
1.暴力法
class Solution {
public:
int firstUniqChar(string s) {
int length=s.size();
if(length<1)
{
return -1;
}
int flag=0;
for(int i=0;i<length;i++)
{
char temp=s[i];
for(int j=0;j<length;j++)
{
if(i==j)
{
continue;
}
if(s[i]==s[j])
{
flag=1;
break;
}
}
if(flag==1)
{
flag=0;
}
else
{
return i;
}
}
return -1;
}
};
2.Map
class Solution {
public:
int firstUniqChar(string s) {
map<char,int>smap;
for(char i:s)
{
smap[i]++;
}
for(int i=0;i<s.size();i++)
{
if(smap[s[i]]==1)
{
return i;
}
}
return -1;
}
};
3.数组模拟map操作
class Solution {
public:
int firstUniqChar(string s) {
// 题意表明,字符是否重复跟顺序无关,因此先以O(N)遍历所有字符,统计对应 字符 出现频率
// 由于字符串 s 长度未知,但 26 个字母,可以只开 26的int[] 数组
int arrCnt[26] = {0} ;
for(auto cha : s) {
arrCnt[cha - 'a']++;
}
for(int i = 0;i<s.size();i++) {
if(arrCnt[s[i] - 'a']==1) return i;
}
return -1;
}
};
思路
根据提示使用哈希映射
遍历一遍字符串记录每个字母出现的次数
遍历hashmap,找出第一个出现次数只有一次的字符