387. First Unique Character in a String
Given a string, find the first non-repeating character in it and return it’s index. If it doesn’t exist, return -1.
Examples:
s = "leetcode"
return 0.
s = "loveleetcode",
return 2.
Note: You may assume the string contain only lowercase letters.
题意理解:
找到字符串中第一个只出现一次的元素位置。若不存在,则返回-1。
解题思路:
有了前几题的基础,看到这题就很容易想到用哈希表unordered_map先统计各元素数量,再找出数量为1的第一个元素位置。
C++:
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<char, int> map;
for (int i=0; i<s.size(); i++)
{
++map[s[i]];
}
for (int i=0; i<s.size(); i++)
{
if (map[s[i]]==1)
return i;
}
return -1;
}
};
但是,这种方法需要两次遍历,当字符串极其长的时候不适用,且看top solution。
TOP SOLUTION:
统计字符数量的同时也保存索引号,然后遍历哈希表。
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<char, pair<int, int>> m;
int idx = s.size();
for (int i=0; i<s.size(); i++)
{
m[s[i]].first++;
m[s[i]].second = i;
}
for (auto &p:m)
{
if (p.second.first==1)
idx = min(idx, p.second.second);
}
return idx==s.size()?-1:idx;
}
};