给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从cityAi 直接前往 cityBi 。请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市 。 
题目数据保证线路图会形成一条不存在循环的线路,因此恰有一个旅行终点站。
示例 1: 
**输入:** paths = [["London","New York"],["New York","Lima"],["Lima","Sao Paulo"]]
**输出:** "Sao Paulo" 
**解释:** 从 "London" 出发,最后抵达终点站 "Sao Paulo" 。本次旅行的路线是 "London" -> "New York" -> "Lima" -> "Sao Paulo" 。
 
示例 2: 
**输入:** paths = [["B","C"],["D","B"],["C","A"]]
**输出:** "A"
**解释:** 所有可能的线路是:
"D" -> "B" -> "C" -> "A". 
"B" -> "C" -> "A". 
"C" -> "A". 
"A". 
显然,旅行终点站是 "A" 。
 
示例 3: 
**输入:** paths = [["A","Z"]]
**输出:** "Z"
 
提示: 
1 <= paths.length <= 100 
paths[i].length == 2 
1 <= cityAi.length, cityBi.length <= 10 
cityAi != cityBi 
所有字符串均由大小写英文字母和空格字符组成。 
 
方法一:哈希表 根据终点站的定义,终点站不会出现在 cityA}_i 中,因为存在从 cityA}_i 出发的线路,所以终点站只会出现在 cityB}_i 中。据此,我们可以遍历 cityB}_i,返回不在 cityA}_i 中的城市,即为答案。
代码实现时,可以先将所有 cityA}_i 存于一哈希表中,然后遍历 cityB}_i 并查询 cityB}_i 是否在哈希表中。
[sol1-Python3] 1 2 3 4 class  Solution :    def  destCity (self, paths: List [List [str ]] ) -> str :         citiesA = {path[0 ] for  path in  paths}         return  next (path[1 ] for  path in  paths if  path[1 ] not  in  citiesA) 
 
[sol1-C++] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class  Solution  {public :    string destCity (vector<vector<string>> &paths)   {         unordered_set<string> citiesA;         for  (auto  &path : paths) {             citiesA.insert (path[0 ]);         }         for  (auto  &path : paths) {             if  (!citiesA.count (path[1 ])) {                 return  path[1 ];             }         }         return  "" ;     } }; 
 
[sol1-Java] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class  Solution  {    public  String destCity (List<List<String>> paths)  {         Set<String> citiesA = new  HashSet <String>();         for  (List<String> path : paths) {             citiesA.add(path.get(0 ));         }         for  (List<String> path : paths) {             if  (!citiesA.contains(path.get(1 ))) {                 return  path.get(1 );             }         }         return  "" ;     } } 
 
[sol1-C#] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public  class  Solution  {    public  string  DestCity (IList<IList<string >> paths )  {         ISet<string > citiesA = new  HashSet<string >();         foreach  (IList<string > path in  paths) {             citiesA.Add(path[0 ]);         }         foreach  (IList<string > path in  paths) {             if  (!citiesA.Contains(path[1 ])) {                 return  path[1 ];             }         }         return  "" ;     } } 
 
[sol1-Golang] 1 2 3 4 5 6 7 8 9 10 11 12 func  destCity (paths [][]string )   string  {    citiesA := map [string ]bool {}     for  _, path := range  paths {         citiesA[path[0 ]] = true      }     for  _, path := range  paths {         if  !citiesA[path[1 ]] {             return  path[1 ]         }     }     return  ""  } 
 
[sol1-JavaScript] 1 2 3 4 5 6 7 8 9 10 11 12 var  destCity = function (paths ) {    const  citiesA = new  Set ();     for  (const  path of  paths) {         citiesA.add (path[0 ]);     }     for  (const  path of  paths) {         if  (!citiesA.has (path[1 ])) {             return  path[1 ];         }     }     return  "" ; }; 
 
复杂度分析