332. 重新安排行程(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:比较特殊的一种回溯树,难点在于如何每次选取排名靠前的字符串,如果直接遍历需要将整个数组遍历完才行,并且每次选取新的字符串的时候都要选取,耗时非常大。比较高效的方法是用unordered_map和map的组合先将数组中的数据全部copy过来,然后每次从里面找,用一次次数就减一。
vector<string> result;
bool backtracking(unordered_map<string, map<string, int>>& targets, int ticketsNum){
if(result.size() == ticketsNum){
return true;
}
for(pair<const string, int>& target : targets[result[result.size()-1]]){
if(target.second > 0){
result.push_back(target.first);
target.second--;
if(backtracking(targets, ticketsNum)) return true;
target.second++;
result.pop_back();
}
}
return false;
}
vector<string> findItinerary(vector<vector<string>>& tickets) {
unordered_map<string, map<string, int>> targets;
for(const vector<string>& vec : tickets){
targets[vec[0]][vec[1]]++;
}
int ticketsNum = tickets.size();
result.push_back("JFK");
backtracking(targets, ticketsNum + 1);
return result;
}