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

 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}
posted @ 2021-03-08 16:43  小傻孩丶儿  阅读(114)  评论(0编辑  收藏  举报