🌈 Scala 实现
题目描述:
-
单词接龙的规则是:
- 用于接龙的单词首字母必须要前一个单词的尾字母相同;
- 当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;
- 已经参与接龙的单词不能重复使用。
-
现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙。
-
请输出最长的单词串,单词串是单词拼接而成,中间没有空格。
输入描述:
- 输入的第一行为一个非负整数,表示起始单词在数组中的索引K,0 <= K < N。
- 输入的第二行为一个非负整数,表示单词的个数N。
- 接下来的N行,分别表示单词数组中的单词。
输出描述:
- 输出一个字符串,表示最终拼接的单词串。
备注:
- 单词个数N的取值范围为[1, 20]
- 单个单词的长度的取值范围为[1, 30]
示例
输入:
- 0
- 6
- word
- dd
- da
- dc
- dword
- d
输出:
- worddwordda
说明:
- 先确定起始单词word,再接以d开头的且长度最长的单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出worddwordda。
输入:
- 4
- 6
- word
- dd
- da
- dc
- dword
- d
输出:
- dwordda
说明:
- 先确定起始单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出dwordda。
代码:
def main(args: Array[String]): Unit = {
// 获取输入
val k = StdIn.readLine().toInt
val n = StdIn.readLine().toInt
var buffer = new ListBuffer[String]()
for (i <- 1 to n) {
buffer += StdIn.readLine()
}
// 记录结果
var res = new StringBuffer()
// 记录第一个单词
res.append(buffer(k))
buffer -= buffer(k)
var flag = true
while (flag) {
// 控制循环退出
breakable {
// 确定下一个单词首字母
val nextPre = res.substring(res.length() - 1)
// 对剩下单词排序
buffer = buffer.sortWith((o1: String, o2: String) => {
if (!o1.length.equals(o2.length)) {
// 当存在多个首字母相同的单词时,取长度最长的单词(降序)
o1.length.compareTo(o2.length) > 0
} else {
// 如果长度也相等则取词典序最小的单词(升序)
o1.compareTo(o2) < 0
}
})
// 找到下一个单词
for (elem <- buffer) {
if (elem.startsWith(nextPre)) {
res.append(elem)
buffer -= elem
break // 如果找打,直接跳出循环
}
}
// 当无法跳出时,则证明没有下一个单词,此时置为 false
flag = false
}
}
// 输出结果
println(res)
}
❤️ END ❤️