给你一份航线列表 tickets
,其中 tickets[i] = [fromi, toi]
表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。
所有这些机票都属于一个从 JFK
(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK
开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。
- 例如,行程
["JFK", "LGA"]
与["JFK", "LGB"]
相比就更小,排序更靠前。
假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。
输入: tickets = [["MUC","LHR"],["JFK","MUC"],["SFO","SJC"],["LHR","SFO"]] 输出: ["JFK","MUC","LHR","SFO","SJC"]
输入: tickets = [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]] 输出: ["JFK","ATL","JFK","SFO","ATL","SFO"] 解释: 另一种有效的行程是 ["JFK","SFO","ATL","JFK","ATL","SFO"] ,但是它字典排序更大更靠后。
1 <= tickets.length <= 300
tickets[i].length == 2
fromi.length == 3
toi.length == 3
fromi
和toi
由大写英文字母组成fromi != toi
class Solution:
def findItinerary(self, tickets: List[List[str]]) -> List[str]:
targets = {}
stack = []
used = set()
itinerary = [("JFK", None, None)]
for fr0m, to in tickets:
if fr0m not in targets:
targets[fr0m] = []
if to not in targets:
targets[to] = []
targets[fr0m].append(to)
for fr0m in targets:
targets[fr0m].sort(reverse=True)
while True:
fr0m = itinerary[-1][0]
for i in range(len(targets[fr0m])):
if (fr0m, i) not in used:
if stack == [] \
or fr0m != stack[-1][0] \
or targets[fr0m][i] != targets[fr0m][stack[-1][1]] \
or len(itinerary) != stack[-1][2]:
stack.append((fr0m, i, len(itinerary)))
while stack[-1][2] < len(itinerary):
_, fr0m, i = itinerary.pop()
used.remove((fr0m, i))
fr0m, i, _ = stack.pop()
used.add((fr0m, i))
itinerary.append((targets[fr0m][i], fr0m, i))
if len(itinerary) == len(tickets) + 1:
return [airport for airport, _, _ in itinerary]