题目:
给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。
class Solution {
// 先回忆一下:首先要把给定的的 二维字符串数组,一一映射
private:
// <出发机场, <到达机场, 航班次数>>
unordered_map<string, map<string, int>> targets;
bool backtracking(int ticketNum, vector<string>& result)
{
if(result.size() == ticketNum + 1)
{
return true;
}
// 这里也是好绕啊~~~~ 一个map是键值对,总有点反应不过来<key, value> mp[key] = value;
// targets[JFK] // 这个里面存放的是什么呢? 是所有出发机场是 JFK 的飞机票的 value 集合,
// 然后这个value是一个pair组成的合集,也是一个map,对这个集合用范围for循环遍历
for(pair<const string, int>& target : targets[result[result.size() - 1]])
{
if(target.second > 0)
{
// result 中相邻两个地点的关系是,前一个是出发地,后一个是目的地
result.push_back(target.first);
target.second--;
if(backtracking(ticketNum, result))
{
return true;
}
result.pop_back();
target.second++;
}
}
return false;
}
public:
vector<string> findItinerary(vector<vector<string>>& tickets)
{
targets.clear();
vector<string> result;
// 因为map中的key是不可修改的,如果不加const
for(const vector<string>& vec : tickets)
{
// 记录映射关系
// 这里感觉好难啊~~~
// targets [vec[0]] [vec[1]]
// 其实就把 target 理解成二维数组就好啦~
targets[vec[0]][vec[1]]++;
}
result.push_back("JFK"); // 起始机场
backtracking(tickets.size(), result);
return result;
}
};