题目:387. 字符串中的第一个唯一字符
- 难度:简单
- 题目:给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
示例 1:
输入: s = "leetcode"
输出: 0
示例 2:
输入: s = "loveleetcode"
输出: 2
示例 3:
输入: s = "aabb"
输出: -1
提示:
解法:
先放上自己想的,for循环遍历,用得也是哈希表映射的思维,但超时了,过不了。
class Solution {
public:
int firstUniqChar(string s) {
int* a = new int[s.size()];
for(int i = 0;i < s.size();i++){
a[i] = 1;
}
//cout << "size: " << s.size();
for(int i = 0;i < s.size();i++){
for(int j = i+1;j < s.size();j++){
if(s[i] == s[j]){
a[i] += 1;
a[j] += 1;
//cout << "s[i]: " << s[i];
//cout <<"a[i]: " << a[i];
}
}
}
for(int i = 0;i < s.size();i++){
if(a[i] == 1){
return i;
}
}
return -1;
}
};
看了题解的:
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<int,int> map;
int n = s.size();
for(char ch:s){ //遍历字符串内的所有字符
++map[ch]; //将其存储在哈希表内,如果键有重复的,对应的值就会加一。并且重复的元素只会在哈希表中保存一个键,后续重复的元素都保存在第一次出现的位置。如果都没有重复,那所有键对应的值都是一。
}
for(int i = 0;i < n;i++){
if(map[s[i]] == 1) //返回第一个没有重复的字符下标
return i;
}
return -1;
}
};
C#解法:
public class Solution {
public int FirstUniqChar(string s) {
//创建字典temp <char,int>
Dictionary<char, int> temp = new Dictionary<char, int>();
//for循环
for (int i = 0; i < s.Length; i++)
{
//如果包含键s[i],将其值改为-1
if(temp.ContainsKey(s[i]))
{
temp[s[i]] = -1;
}
else
{
//否则让键s[i]的值为i
temp[s[i]] = i;
}
}
//遍历所有temp字典中的值
foreach (var item in temp.Values)
{
if(item!=-1)
{
return item;
}
}
return -1;
}
}