深度优先问题,可以用回溯来解决,对于出发机场,每次可以选择一个可达机场,进行深度搜索,如果找到可行方案了就返回,否则就回溯选择下一个可达机场进行深度搜索
由于题目要求只需要一种方案,所以把一般回溯问题的返回值换成了bool,以便找到结果就立刻返回不再继续搜索,还有一个要求是可行方案的选择要依据字典排序更靠前的,所以在【目的机场,出发到目的的票数】这里的容器就由效率更高的哈希map换成了普通的map
class Solution {
private:
//出发机场,[目的机场,出发到目的的票数]
unordered_map<string,map<string,int>> targets;
bool dfs(vector<vector<string>>& tickets,vector<string>&result){
if(result.size()==tickets.size()+1)
return true;
else{
for(pair<const string,int>& p:targets[result.back()]){
if(p.second>0){
result.push_back(p.first);
p.second--;
if(dfs(tickets,result))
return true;
p.second++;
result.pop_back();
}
}
}
return false;
}
public:
vector<string> findItinerary(vector<vector<string>>& tickets) {
vector<string> result;
for(vector<string>& ticket:tickets){
targets[ticket[0]][ticket[1]]++;
}
result.push_back("JFK");
dfs(tickets,result);
return result;
}
};