Facebook面試題專題5 - leetcode133. Clone Graph/76. Minimum Window Substring - Hard
阿新 • • 發佈:2018-12-19
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]