OD机试真题-单词接龙
题自描述
单词接龙Q的规则是:
·可用于接龙的单词首字母必须要前一个单词的尾字母相同
当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词·已经参与接龙的单词不能重复使用
现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙,请输出最长的单词串,单词串是单词拼接而成,中间没有空格。
输入描述
输入的
第一行为一个非负整数,表示起始单词在数组中的索引K(0≤K<N)
第二行为一个非负整数,表示单词的个数 N
接下来的 N 行,分别表示单词数组中的单词
补充说明:
-
单词个数 N 的取值范围为[1,20];
-
单个单词的长度的取值范围为[1,301;
输出描述
输出一个 字符串只,表示最终拼接的单词串。
示例1
输入
0
6
word
dd
da
dc
dword
d
输出
worddwordda
说明
先确定起始单词word,再接以d开头的且长度最长的单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出worddwordda。
示例2
输入
4
6
Word
dd
da
dc
dword
d
输出
dwordda
说明
先确定起始单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出dwordda。
题解
构成一个自定义的 CString 继承 Compare 接口,定义上述比较规则
源码 Java
import java.util.*;public class PhraseLong {static Input input;static {input = new Input("0\n" +"6\n" +"word\n" +"dd\n" +"da\n" +"dc\n" +"dword\n" +"d");input = new Input("4\n" +"6\n" +"Word\n" +"dd\n" +"da\n" +"dc\n" +"dword\n" +"d");}public static void main(String[] args) {int index = Integer.parseInt(input.nextLine());int count = Integer.parseInt(input.nextLine());Map<Character, List<CString>> map = new HashMap<>() ;String first = "";for (int i = 0; i < count; i++) {String word = input.nextLine();if (index == i) {first = word;continue;}List<CString> orDefault = map.getOrDefault(word.charAt(0), new ArrayList<>());orDefault.add(new CString(word));map.put(word.charAt(0), orDefault);}for (Map.Entry<Character, List<CString>> entry : map.entrySet()) {List<CString> value = entry.getValue();Collections.sort(value);}Character ch = first.charAt(first.length() - 1);StringBuilder sb = new StringBuilder(first);while (ch != null) {List<CString> cStrings = map.get(ch);if (cStrings == null || cStrings.size() == 0) {break;}CString remove = cStrings.remove(0);sb.append(remove.value);ch = remove.value.charAt(remove.value.length() - 1);}System.out.println(sb.toString());}static class CString implements Comparable<CString> {public String value;public CString(String value) {this.value = value;}public int compareTo(CString o) {if (this.value.charAt(0) != o.value.charAt(0)) {return this.value.compareTo(o.value);}if (this.value.length() != o.value.length()) {return o.value.length() - this.value.length();}return this.value.compareTo(o.value);}}
}