题解:
回溯三部曲:
1、确定回溯函数参数
//找到一条有效行程就返回 调用时接收返回值
bool backtracking(int ticketNum,vector<string>& result)
2、确定递归终止条件
回溯遍历的过程中,遇到的机场个数,如果达到了(航班数量+1),就说明找到了一个行程,返回即可
3、确定单层搜索过程
遍历寻找有效行程,注意判别机场是否飞过了,飞一次航班次数需要–
class Solution {
public:
//unordered_map<出发机场,map<到达机场,航班次数>> targets
unordered_map<string,map<string,int>> targets;
bool backtracking(int ticketNum,vector<string>& result){
//四个航班涉及5个机场
if(result.size() == ticketNum+1){
//已经找到一个有效的行程 返回即可
return true;
}
//单层搜索过程 pair<到达机场,航班次数>
for(pair<const string,int>& target:targets[result[result.size()-1]]){
//记录到达机场是否飞过了
if(target.second>0){
result.push_back(target.first);
target.second--;
if(backtracking(ticketNum,result)){
return true;
}
//回溯
result.pop_back();
target.second++;
}
}
return false;
}
vector<string> findItinerary(vector<vector<string>>& tickets) {
vector<string> result;
for(const vector<string>& vec:tickets){
//到达机场的航班次数
targets[vec[0]][vec[1]]++;
}
result.push_back("JFK");
backtracking(tickets.size(),result);
return result;
}
};