Given a list of airline tickets represented by pairs of departure and arrival airports [from, to]
, reconstruct the itinerary in order. All of the tickets belong to a man who departs from JFK
. Thus, the itinerary must begin with JFK
.
Note:
- If there are multiple valid itineraries, you should return the itinerary that has the smallest lexical order when read as a single string. For example, the itinerary
["JFK", "LGA"]
has a smaller lexical order than["JFK", "LGB"]
. - All airports are represented by three capital letters (IATA code).
- You may assume all tickets form at least one valid itinerary.
Example 1:
Input:
[["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
Output:["JFK", "MUC", "LHR", "SFO", "SJC"]
Example 2:
Input:
[["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
Output:["JFK","ATL","JFK","SFO","ATL","SFO"]
Explanation: Another possible reconstruction is["JFK","SFO","ATL","JFK","ATL","SFO"]
. But it is larger in lexical order.
参考文献:here。
解这道题的关键点有两个:
1 如何找到唯一的路径。
2 如何保证找到的路径字典序最小。
解决第一个关键点我们需要用到深度搜索,我们从起点开始往后面找,如果发现 找的路径=所有机票+1,那就说明我们找完了。
解决第二个关键点我们需要理解字典序的比较。关于字典序大家可以参考:here。因为STL中的map默认将key按照字典序排列了,所以我们在代码中就没有考虑这个问题了。
class Solution {
public:
vector<string> findItinerary(vector<vector<string>>& tickets) {
map<string, map<string, int>> m;
for (vector<string> &ticket : tickets) {
m[ticket[0]][ticket[1]]++;
}
vector<string> res{ "JFK" };
dfs(res, tickets.size() + 1, m);
return res;
}
bool dfs(vector<string>& res, int over, map<string, map<string, int>> m) {
if (res.size() == over) return true;
if (m.find(res.back()) != m.end()) {
for (auto it = m[res.back()].begin(); it != m[res.back()].end(); it++) {
if (m[res.back()][it->first] > 0) {
m[res.back()][it->first]--;
res.push_back(it->first);
if (dfs(res, over, m)) return true;
res.pop_back();
m[res.back()][it->first]++;
}
}
}
return false;
}
};