題目
387. 字符串中的第一個唯一字符 - 力扣(LeetCode)
思路
用哈希表統計每個字符出現的次數
- 創建一個?unordered_map<char, int>,遍歷字符串,把每個字符出現的次數存進去。
再遍歷字符串,找到第一個只出現一次的字符
- 再次遍歷字符串,查哈希表,如果某個字符的次數為1,返回它的下標。
如果沒有,返回-1
讀者可能出現的錯誤寫法?
class Solution {
public:int firstUniqChar(string s) {vector<char,int> result;for(char e : s){result[e]++;}for(int i = 0;i<result.size();i++){if(result[i] == 1){return i;}}return -1;}
};
1.?vector<char,?int>?result;?語法錯誤
- 解釋:
vector?是順序容器,只能有一個類型參數,比如?vector<int>?或?vector<char>,不能像?map?那樣有兩個類型參數。
- 正確用法:
如果你想統計每個字符出現的次數,應該用?unordered_map<char,?int>?或者用數組?int result[26](只針對小寫字母)。
2.?result[e]++?邏輯錯誤
- 解釋:
vector?不能用字符?e?作為下標,只有數組或?map?才能這樣用。
并且?vector?的下標必須是整數,且不能自動擴容到字符的ASCII值。
- 正確用法:
- 如果用數組:result[e?-?'a']++,前提是?result?長度為26。
- 如果用?unordered_map:result[e]++。
3. 第二個循環遍歷方式錯誤
- 解釋:
你寫的是?for(int?i =?0;?i?< result.size();?i++),但?result.size()?不是字符串長度,而是容器長度。
你應該遍歷字符串?s,判斷每個字符出現的次數是否為1。
- 正確用法:
for(int?i?=?0;?i?<?s.size();?i++)?{ if?(result[s[i]?-?'a']?==?1)?return?i;?}
正確寫法
class Solution {
public:int firstUniqChar(string s) {unordered_map<char,int> result;for(char e : s){result[e]++;}for(int i = 0;i<s.size();i++){if(result[s[i]] == 1){return i;}}return -1;}
};