1. 程式人生 > >Facebook面試題專題5 - leetcode133. Clone Graph/76. Minimum Window Substring - Hard

Facebook面試題專題5 - leetcode133. Clone Graph/76. Minimum Window Substring - Hard

133. Clone Graph

題目描述

給定一個圖,返回它的深拷貝。圖的每個結點包含一個label和neighbors列表(給定的結點和neighbor間有邊連線)。

例子

思想
為了避免迴圈訪問導致死迴圈,用一個字典dic(集合也可以)記錄已被訪問過的結點。

解法

# Definition for a undirected graph node
# class UndirectedGraphNode:
#     def __init__(self, x):
#         self.label = x
#         self.neighbors = []
class Solution: # @param node, a undirected graph node # @return a undirected graph node def cloneGraph(self, node): if not node: return None nodeCloned = UndirectedGraphNode(node.label) dic = {node:nodeCloned} # 記錄已訪問過的結點 queue =
[node] while queue: cur = queue.pop(0) for neigh in cur.neighbors: if neigh not in dic: # 未訪問過, 儲存到dic中 dic[neigh] = UndirectedGraphNode(neigh.label) queue.append(neigh) dic[cur].neighbors.
append(dic[neigh]) return nodeCloned

76. Minimum Window Substring - Hard

題目描述

給定字串S和字串T,找到S中的最小視窗,包含字串T中的所有字元。

如果不存在這樣的視窗,返回空字串"";如果存在,題目保證唯一。

例子

Input: S = “ADOBECODEBANC”, T = “ABC”
Output: “BANC”

思想
要求時間複雜度O(n)
初始化左右指標為位置0,並將t中字元計數儲存在tDic中。
1)移動右指標,直到包含T中所有字元
2)在cnt == 0的前提下,移動左指標,直到遇到T中的字元
3)左指標右移,以再次補全視窗

注意包含多餘t中字元的情況:若t = ‘ABC’,當視窗移動到’DOBECODEB’時,此時tDic[‘B’]+=1,而cnt=1不變;當移動到’DOBECODEBA’時,cnt-=1變為0,而tDic[‘B’] = -1不變。

解法

class Solution(object):
    def minWindow(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: str
        """
        tDic = {}
        for c in t:
            tDic[c] = tDic.get(c, 0) + 1
                
        start = 0
        cnt = len(t)
        minLen = float('inf')
        minLenStart = -1
        for i, c in enumerate(s):
            if c in tDic:
                if tDic[c] > 0:    # 在大於0時, 才有cnt-1
                    cnt -= 1
                tDic[c] -= 1
            
            while cnt == 0:
                if minLen > i - start:
                    minLen = i - start
                    minLenStart = start
                if s[start] in tDic:
                    tDic[s[start]] += 1
                    if tDic[s[start]] > 0:    # 在tDic不滿足條件時, 才有cnt+1
                        cnt += 1
                start += 1
                
        return '' if minLenStart == -1 else s[minLenStart:minLenStart+minLen+1]