1. 題目描述
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:
tickets = [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
Return ["JFK", "MUC", "LHR", "SFO", "SJC"].
Example 2:
tickets = [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
Return ["JFK","ATL","JFK","SFO","ATL","SFO"].
Another possible reconstruction is ["JFK","SFO","ATL","JFK","ATL","SFO"]. But it is larger in lexical order.
2. 思路
- 將航線抽象建模爲一個圖,則題目的意思爲 找出一條航線其可以由所有的票連接而成,若有多條,則選取字典序最小的那條航線。
- 航線的起點爲”JFK”節點,當一個節點的出度爲0時,其必定爲航線的終點。
- 由於鄰接邊用multiset表示,當前的票已經排序,所以深度遍歷時,只要存在邊被遍歷完,則必然是字典序最小的那條。
3. 代碼及複雜度分析
class Solution {
public:
vector<string> findItinerary(vector<pair<string, string>> tickets) {
map<string, multiset<string>> targets;
for (auto ticket : tickets)
targets[ticket.first].insert(ticket.second);
vector<string> itenary;
stack<string> s;
s.push("JFK");
while (!s.empty()) {
string curr_airport = s.top();
if (targets[curr_airport].empty()) {
itenary.push_back(curr_airport);
s.pop();
} else {
s.push(*(targets[curr_airport].begin()));
targets[curr_airport].erase(targets[curr_airport].begin());
}
}
reverse(itenary.begin(), itenary.end());
return itenary;
}
};