问题:
难度:easy
说明:
给出一堆票,然后你将它们路线从 JFK 开始,连接起来,如果有多种可能就按照前缀排序。
问题链接:https://leetcode.com/problems/reconstruct-itinerary/
输入案例:
Example 1:
Input: [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
Output: ["JFK", "MUC", "LHR", "SFO", "SJC"]
Example 2:
Input: [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
Output: ["JFK","ATL","JFK","SFO","ATL","SFO"]
Explanation: Another possible reconstruction is ["JFK","SFO","ATL","JFK","ATL","SFO"].
But it is larger in lexical order.
我的代码:
放完端午回来整个人都散了,看了半天没思路,dp不好用,链表+hashmap感觉不行,所以去看别人的。其实最简单做法就是,弄成树,然后深度遍历。
当然为什么要弄成树,而且我dfs时候我需要删除掉树的节点,我可能要学学有向图,此外用了少用的java api。
class Solution {
public List<String> findItinerary(List<List<String>> tickets) {
HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
// 把每张票遍历,打成树
for(List<String> list : tickets) {
ArrayList<String> temp = map.getOrDefault(list.get(0), new ArrayList<String>());
map.put(list.get(0), sort(list.get(1), temp));
}
// 进行dfs,从JFK开始
List<String> res = new ArrayList<String>();
dfs(map, "JFK", res);
return res;
}
public void dfs(HashMap<String, ArrayList<String>> map, String str, List<String> res) {
ArrayList<String> list = map.get(str);
// dfs有点不同就是要移除树的节点
if(list != null)
while(!list.isEmpty())
dfs(map, list.remove(0), res);
res.add(0,str);
}
// 按字符串前缀进行排序
public ArrayList<String> sort(String str, ArrayList<String> list) {
int size = list.size();
for(int i = 0;i < size;i ++)
if(str.compareTo(list.get(i)) < 0) {
list.add(i, str);
break;
}
if(size == list.size()) list.add(str);
return list;
}
}