友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

1047. 删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 s重复项删除操作会选择两个相邻且相同的字母,并删除它们。

s 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例:

输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。

提示:

  1. 1 <= s.length <= 105

  2. 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);
}