1import java.util.Stack;
2
3/**
4 * 1047. 删除字符串中的所有相邻重复项
5 * 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
6 * <p>
7 * 在 S 上反复执行重复项删除操作,直到无法继续删除。
8 * <p>
9 * 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
10 * <p>
11 * <p>
12 * <p>
13 * 示例:
14 * <p>
15 * 输入:"abbaca"
16 * 输出:"ca"
17 * 解释:
18 * 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
19 * <p>
20 * <p>
21 * 提示:
22 * <p>
23 * 1 <= S.length <= 20000
24 * S 仅由小写英文字母组成。
25 */
26public class RemoveDuplicates {
27 /**
28 * 通过 栈对每一个元素匹配,
29 * <p>
30 * 简单来说 字符串与当前栈内字符进行匹配,如果相同就出栈当前元素,并且跳过当前元素,如果不匹配就入栈
31 *
32 * @param S
33 * @return
34 */
35 public static String removeDuplicates(String S) {
36 Stack<Character> stack = new Stack<>();
37 for (int i = 0; i < S.length(); i++) {
38 if (!stack.isEmpty() && stack.peek() == S.charAt(i)) {
39 stack.pop();
40 continue;
41 } else {
42 stack.push(S.charAt(i));
43 }
44 }
45
46 StringBuilder str = new StringBuilder();
47 for (Character c : stack) {
48 str.append(c);
49 }
50
51 return str.toString();
52 }
53
54 public static void main(String[] args) {
55 String s = "abbaca";
56 System.out.println(removeDuplicates(s));
57 }
58}