1047.删除字符串中的所有相邻重复项(Remove All Adjacent Duplicates In String) | LeetCode 第 1047 题

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

点击进入 LeetCode

给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母,并删除它们。
S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例

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

提示

  1. 1 <= S.length <= 20000
  2. S 仅由小写英文字母组成。

解题思路

针对第 N(N > 1) 个字符的处理方式:

  • 如果 S[N] == S[N+1]
    1. S[N] 和 S[N+1] 为重复项,需要清除
    2. 判断 S[N+2] 是否等于 S[N-1] ,如果相等,重复项继续清除;如果不相等,则从第 N+2 个字符串,继续尽心判断
  • 如果 S[N] != S[N+1]
    • 从第 N+1个字符继续尽心判断

需要做好 N+2 和 N-1 是否越界的判断

题解 JAVA 实现

点击查看其他解题方法

public String removeDuplicates(String S) {

    if (S.length() <= 0) {
        return "";
    }

    Deque deque = new ArrayDeque<>();
    char[] charArray = S.toCharArray();
    deque.addLast(charArray[0]);

    for (int i = 1; i < charArray.length; i++) {
        if (!deque.isEmpty() && deque.peekLast().equals(charArray[i])) {
            deque.pollLast();
            continue;
        } else {
            deque.addLast(charArray[i]);
        }
    }

    StringBuilder result = new StringBuilder();
    while (!deque.isEmpty()) {
        result.append(deque.pollFirst());
    }

    return result.toString();
}
发布了7 篇原创文章 · 获赞 3 · 访问量 315

猜你喜欢

转载自blog.csdn.net/sl285720967/article/details/103135063