友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。
公众号的微信号是: jikerizhi 。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 s
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 s
上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca" 输出:"ca" 解释: 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
提示:
-
1 <= s.length <= 105
-
s
仅由小写英文字母组成。
思路分析
把 StringBuilder
当做栈来使用。将最后一个字符与当前字符比较,相等则删除最后一个字符,否则就添加。
-
一刷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* @author D瓜哥 · https://www.diguage.com
* @since 2025-04-23 21:41:43
*/
public String removeDuplicates(String s) {
// 使用 SB 当做栈,逐步推进
// StringBuilder stack = new StringBuilder();
// int top = -1;
// for (int i = 0; i < s.length(); i++) {
// char c = s.charAt(i);
// if (top >= 0 && stack.charAt(top) == c) {
// stack.deleteCharAt(top);
// top--;
// } else {
// stack.append(c);
// top++;
// }
// }
// return stack.toString();
// 同样的思路,直接在数组上操作。
char[] chars = s.toCharArray();
int top = -1;
for (int i = 0; i < chars.length; i++) {
if (top == -1 || chars[top] != chars[i]) {
chars[++top] = chars[i];
} else {
top--;
}
}
return new String(chars, 0, top + 1);
}