使用kotlin解决这个问题:1209. 删除字符串中的所有相邻重复项 II 提示 中等 174 相关企业 给你一个字符串 s,「k 倍重复项删除操作」将会从 s 中选择 k 个相邻且相等的字母,并删除它们,使被删去的字符串的左侧和右侧连在一起。 你需要对 s 重复进行无限次这样的删除操作,直到无法继续为止。 在执行完所有删除操作后,返回最终得到的字符串。 本题答案保证唯一。 示例 1: 输入:s = "abcd", k = 2 输出:"abcd" 解释:没有要删除的内容。 示例 2: 输入:s = "deeedbbcccbdaa", k = 3 输出:"aa" 解释: 先删除 "eee" 和 "ccc",得到 "ddbbbdaa" 再删除 "bbb",得到 "dddaa" 最后删除 "ddd",得到 "aa" 示例 3: 输入:s = "pbbcggttciiippooaais", k = 2 输出:"ps" 提示: 1 <= s.length <= 10^5 2 <= k <= 10^4 s 中只含有小写英文字母。
时间: 2023-07-21 15:07:15 浏览: 44
可以使用栈来解决这个问题。遍历字符串,将当前字符与栈顶字符进行比较,如果相同则计数器加1,如果不同则重置计数器为1。如果计数器等于k,则弹出栈顶的k个字符。最后将栈中的字符组成字符串输出即可。
代码如下:
```kotlin
fun removeDuplicates(s: String, k: Int): String {
val stack = mutableListOf<Pair<Char, Int>>()
for (c in s) {
if (stack.isEmpty() || stack.last().first != c) {
stack.add(Pair(c, 1))
} else {
val count = stack.last().second + 1
if (count == k) {
for (i in 1..k) {
stack.removeAt(stack.size - 1)
}
} else {
stack[stack.size - 1] = Pair(c, count)
}
}
}
val sb = StringBuilder()
for ((c, _) in stack) {
sb.append(c)
}
return sb.toString()
}
```
测试代码如下:
```kotlin
fun main() {
println(removeDuplicates("abcd", 2)) // abcd
println(removeDuplicates("deeedbbcccbdaa", 3)) // aa
println(removeDuplicates("pbbcggttciiippooaais", 2)) // ps
}
```