题目332 重新安排行程
13.1 官方解析
本题和 753. 破解保险箱 类似,是力扣平台上为数不多的求解欧拉回路 / 欧拉通路的题目。
13.2 解法1
(来自leetcode101 中的解法)
先用哈希表记录起止机场,其中键是起始机场,值是一个多重集合,表示对应的终止机场。因为一个人可能做过重复的线路,所以我们需要使用多重集合储存重复值。储存完成之后,就可以利用栈来恢复从终点到起点飞行的顺序,再将结果逆序得到从起点到终点的顺序。
class Solution {
public:
vector<string> findItinerary(vector<vector<string>>& tickets) {
vector<string> ans;
if (tickets.empty()) {
return ans;
}
unordered_map<string, multiset<string>> hash;
for (const auto& ticket : tickets) {
hash[ticket[0]].insert(ticket[1]);
}
stack<string> s;
s.push("JFK");
while (!s.empty()) {
string next = s.top();
if (hash[next].empty()) {
ans.push_back(next);
s.pop();
}
else {
s.push(*hash[next].begin());
hash[next].erase(hash[next].begin());
}
}
reverse(ans.begin(), ans.end());
return ans;
}
};