387. 字符串中的第一个唯一字符
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
示例 1:
输入: s = “leetcode”
输出: 0
示例 2:
输入: s = “loveleetcode”
输出: 2
示例 3:
输入: s = “aabb”
输出: -1
思路:使用一个二维数组,记录每个字母出现的次数以及最后一次出现的索引。遍历字符串。
将二维数组中出现为1且出现的位置最靠前的返回。
代码如下:
class Solution {
public:
int firstUniqChar(string s) {
int len=s.size();
int n[26][2];
for(int i=0;i<26;i++){
n[i][0]=0;
n[i][1]=-1;
}
for(int i=0;i<len;i++){
n[s[i]-'a'][0]++;
n[s[i]-'a'][1]=i;
}
int ans=-1;
int min=len;
for(int i=0;i<26;i++){
if(n[i][0]==1){
ans=1;
if(n[i][1]<=min){
min=n[i][1];
}
}
}
if(ans==-1)return ans;
return min;
}
};
哈希表写法:
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<char,int> h;
for(int i=0;i<s.size();i++){
h[s[i]]++;
}
for(int i=0;i<s.size();i++){
if(h[s[i]]==1)return i;
}
return -1;
}
};
一维数组写法:
class Solution {
public:
int firstUniqChar(string s) {
int n[26];
memset(n,0,sizeof(n));
for(int i=0;i<s.size();i++){
n[s[i]-'a']++;
}
for(int i=0;i<s.size();i++){
if(n[s[i]-'a']==1)return i;
}
return -1;
}
};