使用kotlin完成这个题目:316. 去除重复字母 提示 中等 931 相关企业 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。 示例 1: 输入:s = "bcabc" 输出:"abc" 示例 2: 输入:s = "cbacdcbc" 输出:"acdb" 提示: 1 <= s.length <= 104 s 由小写英文字母组成
时间: 2024-02-01 16:02:09 浏览: 86
以下是使用 Kotlin 实现的代码:
```kotlin
fun removeDuplicateLetters(s: String): String {
val stack = mutableListOf<Char>()
val count = IntArray(26)
val used = BooleanArray(26)
for (c in s) {
count[c - 'a']++
}
for (c in s) {
count[c - 'a']--
if (used[c - 'a']) {
continue
}
while (stack.isNotEmpty() && c < stack.last() && count[stack.last() - 'a'] > 0) {
used[stack.removeLast() - 'a'] = false
}
stack.add(c)
used[c - 'a'] = true
}
return stack.joinToString("")
}
```
算法思路:
- 维护一个栈来存储最终结果字符串。
- 遍历字符串 s,对于每个字符 c,先将其出现次数减一。
- 如果字符 c 已经在栈中出现过,说明已经处理过了,直接跳过。
- 如果字符 c 比栈顶字符小,且栈顶字符在后面还会出现,则将栈顶字符出栈,直到栈顶字符比 c 小或者不存在。
- 将字符 c 入栈,并标记为已使用。
- 最后将栈中的字符按照顺序连接起来即可。
时间复杂度:O(n),其中 n 是字符串 s 的长度。
空间复杂度:O(1),因为字符集固定为小写字母,所以数组和栈的大小都是常数级别。
阅读全文