原题:
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.
返回第一个只出现一次的字母,我打算先用哈希表存储状态,另一个数组存储第一次出现的位置,结果:
Success
Runtime: 36 ms, faster than 94.80% of C++ online submissions for First Unique Character in a String.
Memory Usage: 12.7 MB, less than 88.01% of C++ online submissions for First Unique Character in a String.
代码:
class Solution {
public:
int firstUniqChar(string s) {
int posi[26]={0};
short stage[26]={0};
for(int i=0;i<s.size();i++){
if(!stage[s[i]-97]){stage[s[i]-97]++;posi[s[i]-97]=i;continue;}
else if(stage[s[i]-97]==1){stage[s[i]-97]=2;}
}
int min=INT_MAX;
for(int i=0;i<26;i++){
if(stage[i]==1&&min>posi[i]){min=posi[i];}
}
if(min==INT_MAX){return -1;}
return min;
}
};
想进一步提高存储和速度,想了想发现short变量数组可以省去,用posi单独代表状态和位置,=0时代表第一次出现,设置为当前位置+1,>0时代表已经出现过一次,设为-1,结果:
Success
Runtime: 32 ms, faster than 97.39% of C++ online submissions for First Unique Character in a String.
Memory Usage: 12.7 MB, less than 93.94% of C++ online submissions for First Unique Character in a String.
代码:
class Solution {
public:
int firstUniqChar(string s) {
int posi[26]={0};
for(int i=0;i<s.size();i++){
if(posi[s[i]-97]==0){posi[s[i]-97]=i+1;continue;}
else if(posi[s[i]-97]>0){posi[s[i]-97]=-1;}
}
int min=INT_MAX;
for(int i=0;i<26;i++){
if(posi[i]>0&&min>posi[i]){min=posi[i];}
}
if(min==INT_MAX){return -1;}
return min-1;
}
};
速度有一点提升,翻看solution发现他是我第一种解法。