1. 程式人生 > >leetcode筆記-資料結構-雜湊表

leetcode筆記-資料結構-雜湊表

同構字串

一對字串 字母間需要唯一的對映關係,使用雜湊表可以找到key-value對映關係 從s到t 和 t到s 都需要唯一對映 需要用一個表儲存s到t的對映,另一個表儲存t中已經被對映過的字母

def isIsomorphic(self, s, t):
        k = list(s)
        v = list(t)
        m = len(k)
        n = len(v)
        if m!=n:
            return False
        d = {}
        s = set()
        for i in range
(len(k)): if k[i] in d: if d[k[i]]!=v[i]: return False else: if v[i] in s: return False else: s.add(v[i]) d[k[i]] = v[i] return True

兩個列表的最小索引總和

開始選擇遍歷list1,在list2中查詢list1元素,然後返回對應的index。返回陣列中保留索引和較小的結果,由於進行了列表中查詢和定位2次查詢操作,執行時間較長。 改為先將list2中項存入字典中,對字典進行查詢。速度有了較大提高

    def findRestaurant(self, list1, list2):
        ret = []
        m = {}
        min_index = 2000
        for i,s in enumerate(list2):
            m[s] = i
        for
i,s in enumerate(list1): if s in m: index = m[s] cur_index = index+i if cur_index<min_index: min_index = cur_index ret = [s] elif cur_index==min_index: ret.append(s) return ret

字串中的第一個唯一字元

用字典記錄每個字元是否重複出現過。

def firstUniqChar(self, s):
        l = [0]* len(s)
        m = {}
        s1 = list(s)
        for i,string in enumerate(s1):
            if string in m:
                l[i] = 1
                l[m[string]] = 1
            else:
                m[string] = i
        for i,flag in enumerate(l):
            if flag == 0:
                return i
        return -1

有效的數獨

劃分行列塊,記錄是否已出現

 def isValidSudoku(self, board):
        rows = [{} for i in range(9)]
        column = [{} for j in range(9)]
        block = [{} for k in range(9)]
        for i,row in enumerate(board):
            for j,num in enumerate(row):
                if num != '.':
                    k = (i//3)*3+j//3
                    if num in rows[i] or num in column[j] or num in block[k]:
                        return False
                    else:
                        rows[i][num]=i
                        column[j][num]=j
                        block[k][num]=k
        return True

字母異位詞分組

以排序後的字元為key 判斷是否相同

def groupAnagrams(self, strs):
        ret = []
        map = {}
        for s in strs:
            key = "".join(sorted(s))
            if key in map:
                i = map[key]
                ret[i].append(s)
            else:
                map[key] = len(ret)
                ret.append([s])
        return ret

總結

1.利用set可以儲存不重複元素,用於查重 2.字典key-value 可以儲存兩元素的對映關係 也可以value記錄元素的資訊 3.以排序後的陣列或字串為key;用下標,偏移量為key 4.陣列已知下標時 查詢為O(1) 利用字典儲存下標