每日一練(23):第一個只出現一次的字元

加班猿發表於2022-03-01

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 ' ';
}

相關文章