332. 重新安排行程
给你一份航线列表
tickets
,其中 tickets[i] = [from
i
, to
i
]
表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。所有这些机票都属于一个从
JFK
(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK
开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。- 例如,行程
["JFK", "LGA"]
与["JFK", "LGB"]
相比就更小,排序更靠前。
假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。
示例 1:

输入:tickets = [["MUC","LHR"],["JFK","MUC"],["SFO","SJC"],["LHR","SFO"]] 输出:["JFK","MUC","LHR","SFO","SJC"]
示例 2:

输入: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
from
i
.length == 3
to
i
.length == 3
from
i
和to
i
由大写英文字母组成
from
i
!= to
i
通过次数38,178提交次数84,973
回溯
思路
先用字典建立邻接表,然后深度搜索路径,搜索的时候,对每一个节点,都优先选择排序靠前的。所以对每一个节点都对其子节点进行排序。
然后选择了当前节点,就要及时删掉,否则会出现死循环
题解
class Solution: def findItinerary(self, tickets: List[List[str]]) -> List[str]: # defaultdic(list) 是为了方便直接append tickets_dict = defaultdict(list) for item in tickets: tickets_dict[item[0]].append(item[1]) self.target = len(tickets) self.path = ["JFK"] self.backtracking(start_point="JFK", tickets_dict=tickets_dict) return self.path def backtracking(self, start_point, tickets_dict): # 终止条件 if len(self.path) == self.target + 1: return True tickets_dict[start_point].sort() for _ in tickets_dict[start_point]: # 必须及时删除,避免出现死循环 end_point = tickets_dict[start_point].pop(0) self.path.append(end_point) # 只要找到一个就可以返回了 if self.backtracking(end_point, tickets_dict): return True self.path.pop() tickets_dict[start_point].append(end_point)