题目描述
小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方法:
使用一个栈来存储字符。遍历输入字符串的每个字符,如果栈顶字符与当前字符相同,则弹出栈顶字符;否则,将当前字符推入栈中。最后,从栈中弹出所有字符并构建结果字符串,注意要反转结果字符串。