前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
单词接龙的规则是:
- 可用于接龙的单词首字母必须要前一个单词的尾字母相同;
- 当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;
- 已经参与接龙的单词不能重复使用。
现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙,请输出最长的单词串,单词串是单词拼接而成,中间没有空格。
输入
输入的第一行为一个非负整数,表示起始单词在数组中的索引K,0 <= K < N ;
输入的第二行为一个非负整数,表示单词的个数N;
接下来的N行,分别表示单词数组中的单词。备注:
单词个数N的取值范围为[1, 20];
单个单词的长度的取值范围为[1, 30];
输出
输出一个字符串,表示最终拼接的单词串。
示例
示例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。
解题思路
使用TreeSet存储单词,天然按字符顺序排序。
题解
Java实现
package huawei.e100;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
/**
* @author arnold
* @date 2025年1月2日
* 单次接龙
*/
public class T44 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int index = sc.nextInt();
int num = sc.nextInt();
String start = null;
Set<String> words = new TreeSet<>();
sc.nextLine();
for (int i = 0; i < num; i++) {
String word = sc.nextLine().trim();
words.add(word);
if (i == index) {
start = word;
}
}
String s = run(words, start);
System.out.println(s);
}
}
static String run(Set<String> words, String start){
StringBuilder sb = new StringBuilder();
sb.append(start);
words.remove(start);
while(words.size() > 0 ) {
Iterator<String> it = words.iterator();
String next = null;
while(it.hasNext()) {
String w = it.next();
if(w.charAt(0) == start.charAt(start.length()-1)) {
if(next == null) {
next = w;
} else {
if(w.length() > next.length()) {
next = w;
}
}
}
}
if(next != null) {
sb.append(next);
words.remove(next);
start = next;
} else {
break;
}
}
return sb.toString();
}
}
标签:String,44,OD,next,单词,start,接龙,words
From: https://blog.csdn.net/arnold66/article/details/144887564