相邻重复字母删除问题 | 豆包MarsCode AI刷题

196 阅读1分钟

题目描述

小M拿到了一个由小写字母组成的字符串 s。她发现可以进行一种操作:选择两个相邻且相同的字母并删除它们。她可以在 s 上反复进行此操作,直到无法再删除任何字母。

请返回最终处理完所有重复项删除操作后的字符串。可以保证返回的答案是唯一的。

测试样例

样例1:

输入:s = "abbaca"
输出:'ca'

样例2:

输入:s = "azxxzy"
输出:'ay'

样例3:

输入:s = "a"
输出:'a'

解题思路

这个问题可以通过使用栈(Stack)来解决。我们可以遍历字符串中的每个字符,并将其逐个推入栈中。如果栈顶的字符与当前字符相同,我们就将栈顶的字符弹出(删除相邻重复字符)。最后,栈中的字符顺序就是我们想要的结果。

代码展示

import java.util.Stack;
public class Main {
    public static String solution(String s) {
        Stack<Character> stack = new Stack<>();

        for (char c : s.toCharArray()) {
            // 如果栈不为空且栈顶元素与当前字符相同,弹出栈顶元素
            if (!stack.isEmpty() && stack.peek() == c) {
                stack.pop();
            } else {
                // 否则将当前字符推入栈中
                stack.push(c);
            }
        }

        // 构建结果字符串
        StringBuilder result = new StringBuilder();
        while (!stack.isEmpty()) {
            result.append(stack.pop());
        }

        // 由于栈是后进先出,反转结果字符串
        return result.reverse().toString();
    }

    public static void main(String[] args) {
        System.out.println(solution("abbaca").equals("ca")); // 输出: true
        System.out.println(solution("azxxzy").equals("ay")); // 输出: true
        System.out.println(solution("a").equals("a"));       // 输出: true
    }
}

代码说明

solution方法:

使用一个栈来存储字符。遍历输入字符串的每个字符,如果栈顶字符与当前字符相同,则弹出栈顶字符;否则,将当前字符推入栈中。最后,从栈中弹出所有字符并构建结果字符串,注意要反转结果字符串。