删除字符串中的所有相邻重复项 II
难度:
标签:
题目描述
代码结果
运行时间: 62 ms, 内存: 20.5 MB
/*
* 思路:
* 使用栈结构来存储字符和其计数。
* 遍历字符串,利用Java 8的Stream API来处理。
* 如果栈顶元素与当前字符相同,则计数加一。
* 如果计数达到k,则从栈中移除该元素。
* 最后,利用StringBuilder构建最终的字符串结果。
*/
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public String removeDuplicates(String s, int k) {
Stack<Pair> stack = new Stack<>();
s.chars().mapToObj(c -> (char) c).forEach(c -> {
if (!stack.isEmpty() && stack.peek().character == c) {
stack.peek().count++;
if (stack.peek().count == k) {
stack.pop();
}
} else {
stack.push(new Pair(c, 1));
}
});
return stack.stream()
.map(p -> String.valueOf(p.character).repeat(p.count))
.collect(Collectors.joining());
}
class Pair {
char character;
int count;
Pair(char character, int count) {
this.character = character;
this.count = count;
}
}
}
解释
方法:
此题解采用栈的数据结构来解决问题。对于每一个字符,若栈为空或栈顶元素与当前字符不同,则将此字符和计数1作为一个列表推入栈中。如果栈顶元素与当前字符相同,则增加栈顶元素的计数。当栈顶元素的计数达到k时,将其从栈中弹出,这模拟了删除k个相同字符的操作。最后,栈中剩余的元素代表了最终的字符串,其中每个元素包括字符及其剩余次数,将它们拼接起来得到最终结果。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在解题思路中,使用栈来处理字符串中的重复字符时,为什么选择栈而不是其他数据结构如队列或链表?
▷🦆
当栈顶元素的计数达到k时,我们移除这个元素,但如果栈顶下面的元素与当前处理的字符相同,这种情况如何处理?
▷🦆
解题思路中提到,最坏情况下每个字符可能多次进出栈,能否给出一个具体的示例说明这种情况如何发生?
▷