1. 程式人生 > 實用技巧 >Q14 世界盃參賽國的國名接龍

Q14 世界盃參賽國的國名接龍

Q14 世界盃參賽國的國名接龍

FIFA 世界盃對足球愛好者而言是四年一度的盛事。下面我們拿 2014 年世界盃參賽國的國名做個詞語接龍遊戲。不過,這裡用的不是中文,而是英文字母(忽略大小寫)

import java.util.*;
class Solution{
	static int maxLen = Integer.MIN_VALUE;
	static HashSet<String> set = new HashSet<>();
	static LinkedList<String> finalPath;
	public static void main(String[] args) {
		String[] countries = new String[]{"Brazil", "Croatia", "Mexico", "Cameroon","Spain", "Netherlands", "Chile", "Australia","Colombia", "Greece", "Cote d'Ivoire", "Japan","Uruguay", "Costa Rica", "England", "Italy","Switzerland", "Ecuador", "France", "Honduras","Argentina", "Bosnia and Herzegovina", "Iran","Nigeria", "Germany", "Portugal", "Ghana","USA", "Belgium", "Algeria", "Russia","Korea Republic"};
		// 將字串全部變為小寫
		for(int i =0;i<countries.length;i++) countries[i] = countries[i].toLowerCase();
		for(String country:countries) System.out.println(country);
		// 可以從任何一個開始
		LinkedList<String> path = new LinkedList<>();
		for(String country:countries) helper(countries,country,1,set,path);
		System.out.println(maxLen);
		System.out.println(finalPath);
	}
	public static void helper(String[] countries,String prev,int depth,HashSet<String> used,LinkedList<String> path){
		//將prev country 裝進path中,並且裝進已用的國家名稱的集合內
		System.out.println(depth + "++++++++++++++++++"+path);
		used.add(prev);
		path.add(prev);
		// 如果當前的國家名稱接龍的長度大於現在已經記錄的全域性的最長的成語接龍的長度,則更新最終記錄的path,以及更新全域性最長的長度
		if(depth > maxLen){
			finalPath = new LinkedList<>(path);
			maxLen = depth;
		}
		System.out.print(prev + " --- ");
		// 獲得prev country的第一個末尾字母
		char prevLastChar = prev.charAt(prev.length()-1);
		// 獲取所有可用的國家的名字,用一個佇列進行儲存
		Queue<String> queue = new LinkedList<>();
		for(String str:countries) if(str.length()>0 && !used.contains(str) && str.charAt(0) == prevLastChar) queue.offer(str);
		System.out.println(queue);
		// 然後對佇列中的元素進行接龍
		while(!queue.isEmpty()) {
			String tmp = queue.peek();
			helper(countries,queue.poll(),depth+1,used,path);
			// 從已經用過的used的國家的名稱集合中刪除掉當前遍歷的國家名稱
			used.remove(tmp);
			path.remove(tmp);
		}
		used.remove(prev);
		path.remove(prev);
	}
}