思考过程:
读完题目,首先想到的是用dfs或者bfs的思路解题,dfs,首先从所有行程中,找到“JFK”开始的行程,然后把此行程的to添加到ans,切to为新的开始行程,并把此行程删除后,再在剩下的行程中找开始行程,依次。然后找到一个结果后,保存,再找到一个结果,和上一次的比较后保存字符自然排序靠前的结果。
代码实现:
//[["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
public List<String> findItinerary(List<List<String>> tickets) {
if (tickets.size() < 1) {
return new ArrayList<>();
}
String start = "JFK";
List<String> result = new ArrayList<>();
List<String> ans = new ArrayList<>();
ans.add(start);
Set<String> history = new HashSet<>();
dfs(tickets, ans, result, history, tickets.size() + 1);
return result;
}
private void dfs(List<List<String>> tickets, List<String> ans,
List<String> result, Set<String> history, int len) {
if (tickets.size() == 0 && ans.size() == len) {
if (result.size() == 0) {
result.addAll(ans);
} else {
boolean replace = false;
for (int i = 0; i < ans.size(); i++) {
int com = result.get(i).compareTo(ans.get(i));
if (com > 0) {
replace = true;
break;
} else if (com < 0) {
break;
}
}
if (replace) {
result.clear();
result.addAll(ans);
}
}
return;
}
StringBuilder ansStr = new StringBuilder();
for (String s : ans) {
ansStr.append(s);
}
if (history.contains(ansStr.toString())) {
return;
}
history.add(ansStr.toString());
String lastTo = ans.get(ans.size() - 1);
for (int j = 0; j < tickets.size(); j++) {
List<String> route = tickets.get(j);
String from = route.get(0);
String to = route.get(1);
if (lastTo.equals(from)) {
List<String> newAns = new ArrayList<>(ans);
newAns.add(to);
List<List<String>> newTic = new ArrayList<>(tickets);
newTic.remove(j);
dfs(newTic, newAns, result, history, len);
}
}
}
执行结果:
超时。说明解题思路是对的,代码也能够求解简单的题,但是效率不够。
使用 Hierholzer算法 解决欧路径问题。