🌈 Scala 实现
题目描述:
- 给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第 k 长的子串的长度,相同字母只取最长的那个子串。
输入描述:
- 第一行有一个子串(1<长度<=100),只包含大写字母。
- 第二行为 k的值
输出描述:
- 输出连续出现次数第k多的字母的次数。
示例
输入:
- AABAAA
- 2
输出:
- 1
说明:
- 同一字母连续出现最多的A 3次
- 第二多2次 但A出现连续3次
输入:
- AAAAHHHBBCDHHHH
- 3
输出:
- 2
说明:
- 同一字母连续出现的最多的是A和H,四次
- 第二多的是H,3次
代码:
def main(args: Array[String]): Unit = {
// 获取输入
val line = StdIn.readLine().toList
val k = StdIn.readLine().toInt
var count = 1
val buffer = new ListBuffer[Tuple2[Char, Int]]
// 差分输入
for (i <- 1 until line.length) {
// 记录每一次的字符及次数
if (line(i) == line(i - 1)) {
count += 1
} else {
buffer += Tuple2(line(i - 1), count)
count = 1
}
// 获取最后的字符及次数
if (i == line.length - 1) buffer += Tuple2(line(line.length - 1), count)
}
// 如果子串中只包含同一字母的子串数小于k,则输出-1
if (buffer.length < k) {
println(-1)
return
}
// 排序
val tuples = buffer.sortWith((o1, o2) => {
if (!o1._2.equals(o2._1)) o1._2.compareTo(o2._2) > 0 else o1._1.compareTo(o2._1) > 0
})
// 获取输出
var res = 1
for (i <- 1 to k) {
if (tuples(i)._1 == tuples(i - 1)._1) res += 1 else res = 1
}
println(res)
}
❤️ END ❤️