【LeetCode】332. 重新安排行程

332. 重新安排行程(困难)

思路

    由于题目保证了存在一条合法的旅行路线,并要求按照字典序返回完整的路线。该方法通过深度优先搜索和栈的结合,可以保证每次选择字典序最小的终点进行访问,从而得到按照字典序排列的完整旅行路线。 具体来说,首先创建一个无序映射hash,用于存储每个出发地对应的目的地集合。遍历给定的机票列表,将每个出发地和目的地添加到hash中。 接着通过使用栈来模拟递归的过程,可以保证每次都选择字典序最小的终点进行访问。在每次循环中,如果当前终点的终点集合为空,说明已经到达终点,将当前终点插入到结果数组中,并将其从栈中弹出。如果当前终点的终点集合不为空,说明还有未访问的终点,选择其中一个终点压入栈中,并从终点集合中删除。通过这样的方式,可以按照字典序排列完整的旅行路线。 最后,将答案ans进行反转,得到正确的行程路线。

代码

class Solution {
          
   
public:
    vector<string> findItinerary(vector<vector<string>>& tickets) {
          
   
        unordered_map<string, multiset<string>> hash;
        vector<string> ans;

        for(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;
    }
};
经验分享 程序员 微信小程序 职场和发展