アイデア:
この質問では、マップコンテナを直接使用して解決できます。それでもスペースと時間の効率を追求する場合は、文字列に含まれる小文字が26文字しかないため、ハッシュアルゴリズムを自分で実装し、配列を使用できます。各要素の数を記録するch []
- まず、要素値を-1に設定します
- 次に、文字列をトラバースします。要素に対応するch配列の値が-1の場合、それは以前に表示されていないことを意味するため、この時点で、ch []要素の値を文字列に対応する添え字に設定します。 0以上の場合は、以前に表示されたことを意味します。この時点で、ch []要素の値を-2に設定します(区別される場合)。
- ch []配列をトラバースし、-2、-1要素を無視し、変数を使用して配列の最小値を記録するだけです。
コード:
class Solution {
public:
char firstUniqChar(string s) {
char ch=' ';
if(s.size()==0) return ch;
map<char,int> mp;
for(auto &i:s){
mp[i]++;
}
for(auto &i:s){
if(mp[i]==1){
return i;
}
}
return ch;
}
};
//代码二
class Solution {
public:
char firstUniqChar(string s) {
char op = ' ';
if(s.size()==0) return op;
int ch[27];
for(int i=0;i<27;++i){
ch[i] = -1;
}
int ans = INT_MAX;
for(int i=0;i<s.size();++i){
int idx = s[i] - 'a';
if(ch[idx]==-1){
ch[idx] = i;
}else if(ch[idx]>=0){
ch[idx] = -2;
}
}
for(int i=0;i<27;++i){
if(ch[i]>=0){
ans = min(ans,ch[i]);
}
}
if(ans==INT_MAX) return ' ';
else return s[ans];
}
};