(python版)《劍指Offer》JZ34:第一個只出現一次的字元
【思路1】雜湊表
- 初始化: 字典 (Python),記為 dic ;
- 字元統計: 遍歷字串 s 中的每個字元 c ;
- 若 dic 中 不包含 鍵(key) c :則向 dic 中新增鍵值對 (c, True) ,代表字元 c 的數量為 1 ;
- 若 dic 中 包含 鍵(key) c :則修改鍵 c 的鍵值對為 (c, False) ,代表字元 c 的數量 > 1 。
- 查詢數量為 1 的字元:
遍歷字串 s 中的每個字元 c ;
若 dic中鍵 c 對應的值為 True :,則返回 c 。 - 返回 ’ ’ ,代表字串無數量為 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()
相關文章
- [演算法練習及思路-leetcode劍指offer(Java解法)]No50.第一個只出現一次的字元演算法LeetCodeJava字元
- 劍指Offer 字元流中第一個不重複的字元字元
- 第一個只出現一次的字元——Java字元Java
- 第一次只出現一次的字元字元
- 每日一練(23):第一個只出現一次的字元字元
- JZ-034-第一個只出現一次的字元位置字元
- 劍指offer-JavaScript版JavaScript
- 劍指OFFER
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- 劍指Offer-38-兩個連結串列的第一個公共節點
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- 劍指 Offer 48. 最長不含重複字元的子字串字元字串
- 《劍指 Offer》棧實現佇列佇列
- 劍指offer解析-上(Java實現)Java
- 劍指offer解析-下(Java實現)Java
- 劍指Offer-31-最小的K個數
- (python版)《劍指Offer》JZ06:旋轉陣列的最小數字Python陣列
- leetcode 劍指 Offer 48. 最長不含重複字元的子字串LeetCode字元字串
- 力扣 - 劍指 Offer 52. 兩個連結串列的第一個公共節點力扣
- 劍指offer-用兩個棧實現佇列-php佇列PHP
- 劍指offer | 09. 用兩個棧實現佇列佇列
- 劍指offer導航
- Leetcode劍指offer(八)LeetCode
- 劍指 offer21
- 劍指offer16
- 劍指 offer20
- Leetcode 劍指 Offer 40. 最小的k個數LeetCode
- 劍指 Offer 56 - I. 陣列中數字出現的次數陣列
- 【劍指offer】【2】字串的空格字串
- 劍指 offer 第一題: 二維陣列中的查詢陣列
- 【劍指offer】二進位制中1的個數
- 【劍指Offer】矩形覆蓋
- 劍指Offer題解合集
- 劍指offer——跳臺階
- 六、劍指 Offer(25~29)
- 劍指 Offer 63. 股票的最大利潤-Python題解Python
- 劍指 Offer 38. 字串的排列字串
- 劍指Offer 表示數值的字串字串