(python版)《劍指Offer》JZ34:第一個只出現一次的字元

龍共日堯發表於2020-12-26

牛客
Leetcode
在這裡插入圖片描述

【思路1】雜湊表

  1. 初始化: 字典 (Python),記為 dic ;
  2. 字元統計: 遍歷字串 s 中的每個字元 c ;
    • 若 dic 中 不包含 鍵(key) c :則向 dic 中新增鍵值對 (c, True) ,代表字元 c 的數量為 1 ;
    • 若 dic 中 包含 鍵(key) c :則修改鍵 c 的鍵值對為 (c, False) ,代表字元 c 的數量 > 1 。
  3. 查詢數量為 1 的字元
    遍歷字串 s 中的每個字元 c ;
    若 dic中鍵 c 對應的值為 True :,則返回 c 。
  4. 返回 ’ ’ ,代表字串無數量為 1 的字元。

注:

  • not c in dic 整體為一個布林值;
  • c in dic 為判斷字典中是否含有鍵 c
class Solution:
    def firstUniqChar(self, s: str) -> str:
        dic = {}
        for c in s:
            dic[c] = not c in dic
        for c in s:
            if dic[c]: return c
        return ' '
'''
作者:jyd
連結:https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/solution/mian-shi-ti-50-di-yi-ge-zhi-chu-xian-yi-ci-de-zi-3/
來源:力扣(LeetCode)
'''

在這裡插入圖片描述
在這裡插入圖片描述

  • 時間複雜度 O(N): N 為字串 s 的長度;需遍歷 s 兩輪,使用 O(N) ;HashMap 查詢操作的複雜度為 O(1);
  • 空間複雜度 O(1) : 由於題目指出 s 只包含小寫字母,因此最多有 26 個不同字元,HashMap 儲存需佔用 O(26) = O(1) 的額外空間。

【思路2】遍歷雜湊表查詢字元

在雜湊表的基礎上,有序雜湊表中的鍵值對是 按照插入順序排序 的。基於此,可通過遍歷有序雜湊表,實現搜尋首個 “數量為 1 的字元”。

雜湊表是 去重 的,即雜湊表中鍵值對數量 ≤ 字串 s 的長度

複雜度同上,不一樣的是該法只需遍歷一輪字串s

class Solution:
    def firstUniqChar(self, s: str) -> str:
        dic = {}
        for c in s:
            dic[c] = not c in dic
        for k, v in dic.items():
            if v: 
            	return k
        return ' '
'''
作者:jyd
連結:https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/solution/mian-shi-ti-50-di-yi-ge-zhi-chu-xian-yi-ci-de-zi-3/
來源:力扣(LeetCode)
'''

比如 s=‘ababc’,第二輪遍歷s 得5次才找到c
而dic={‘a’: False, ‘b’: False, ‘c’:True},遍歷dic只需3次找到

在這裡插入圖片描述

用有序表反而慢了 dic = collections.OrderedDict()
在這裡插入圖片描述

相關文章