title: 每日一練(23):第一個只出現一次的字元
categories:[劍指offer]
tags:[每日一練]
date: 2022/02/22
每日一練(23):第一個只出現一次的字元
在字串 s 中找出第一個只出現一次的字元。如果沒有,返回一個單空格。 s 只包含小寫字母。
示例 1:
輸入:s = "abaccdeff"
輸出:'b'
示例 2:
輸入:s = ""
輸出:' '
限制:
0 <= s 的長度 <= 50000
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
方法一:雜湊表
思路
1.對字串進行兩次遍歷。
- 遍歷字串
s
,使用雜湊表統計 “各字元數量是否 >1 ”。 - 再遍歷字串
s
,在雜湊表中找到首個 “數量為 1 的字元”,並返回。
演算法
1.字元統計: 遍歷字串 s 中的每個字元 c ;
- 若 dic 中 不包含 鍵(key) c :則向 dic 中新增鍵值對 (c, True) ,代表字元 c 的數量為 1 ;
- 若 dic 中 包含 鍵(key) c :則修改鍵 c 的鍵值對為 (c, False) ,代表字元 c 的數量 >1 。
2.查詢數量為 1 的字元: 遍歷字串 s 中的每個字元 c ;
- 若 dic中鍵 c 對應的值為 True :,則返回 c 。
3.返回 ' ' ,代表字串無數量為 1 的字元。
char firstUniqChar(string s) {
if (s.empty()) { //注意邊界情況的處理!特別是s為空字串的情況
return ' ';
}
unordered_map<int, bool> dic;
for (char c : s) {
dic[c] = dic.find(c) == dic.end();
}
for (char c : s) {
if (dic[c]) {
return c;
}
}
return ' ';
}
方法二:巧用string容器的查詢函式
思路和演算法
- s.find(s[i]) : 返回字串s中從左向右查詢s[i]第一次出現的位置;
- s.rfind(s[i]) : 返回字串s中從右向左查詢s[i]第一次出現的位置;
此方法雖然看起來程式碼簡潔,但是時間複雜度較高!
char firstUniqChar(string s) {
if (s.empty()) { //注意邊界情況的處理!特別是s為空字串的情況
return ' ';
}
int n = s.size();
for(int i = 0; i < n; i++){
if(s.find(s[i]) == s.rfind(s[i])){
return s[i];
}
}
return ' ';
}