单词接龙的规则是:
可用于接龙的单词首字母必须要前一个单词的尾字母相同
当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;已经参与接龙的单词不能重复使用
现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙,
请输出最长的单词串,单词串是单词拼接而成,中间没有空格
输入描述:
输入的第一行为一个非负整数,表示起始单词在数组中的索引K,0 <= K < N
输入的第二行为一个非负整数,表示单词的个数N;
接下来的N行,分别表示单词数组中的单词
备注:
单词个数N的取值范围为[1,20];
单个单词的长度的取值范围为[1,30]
输出描述:输出一个字符串,表示最终拼接的单词串
//存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词
//接龙的单词首字母必须要前一个单词的尾字母相同
import java.util.*;
public class Main{
static boolean[] used;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//起始索引
int startIndex = sc.nextInt();
//数组长度
int len = sc.nextInt();
sc.nextLine();
List<String> words = new ArrayList<>();
for(int i = 0;i < len;i++){
words.add(sc.nextLine());
}
StringBuffer res = new StringBuffer(words.get(startIndex));
//记录结尾字母
char end = words.get(startIndex).charAt(words.get(startIndex).length() - 1);
String m = words.get(startIndex);
//数组做使用的标记
used = new boolean[len];
words.sort((a,b)->{
if(a.length() != b.length()){
//按长度
return b.length() - a.length();
}else{
//按字典序
return a.compareTo(b);
}
});
for(int i = 0;i < words.size();i++){
if(words.get(i).equals(m)){
used[i] = true;
break;
}
}
dfs(0,words,res,end);
System.out.print(res.toString());
}
public static void dfs(int start,List<String> words,StringBuffer res,char end){
for(int i = 0;i < words.size();i++){
//没使用过
if(!used[i]&&words.get(i).charAt(0) == end){
res.append(words.get(i));
used[i] = true;
end = words.get(i).charAt(words.get(i).length() - 1);
dfs(0,words,res,end);
break;
}
}
}
}