1. 程式人生 > 實用技巧 >LeetCode——刪除字串中的所有相鄰重複項 II

LeetCode——刪除字串中的所有相鄰重複項 II

Q:給你一個字串 s,「k 倍重複項刪除操作」將會從 s 中選擇 k 個相鄰且相等的字母,並刪除它們,使被刪去的字串的左側和右側連在一起。
你需要對 s 重複進行無限次這樣的刪除操作,直到無法繼續為止。
在執行完所有刪除操作後,返回最終得到的字串。
本題答案保證唯一。

示例 1:
輸入:s = "abcd", k = 2
輸出:"abcd"
解釋:沒有要刪除的內容。
示例 2:
輸入:s = "deeedbbcccbdaa", k = 3
輸出:"aa"
解釋:
先刪除 "eee" 和 "ccc",得到 "ddbbbdaa"
再刪除 "bbb",得到 "dddaa"
最後刪除 "ddd",得到 "aa"
示例 3:
輸入:s = "pbbcggttciiippooaais", k = 2
輸出:"ps"

A:

  1. 暴力解:
public String removeDuplicates(String s, int k) {
        while (s.length() >= k) {
            boolean flag = true;
            StringBuilder sub = new StringBuilder();
            for (int i = 0; i < s.length(); i++) {
                if (i + k <= s.length()) {
                    int count = 1;
                    int curr = s.charAt(i);
                    for (int j = i + 1; j < i + k; j++) {
                        if (curr == s.charAt(j))
                            count++;
                        else
                            break;
                    }
                    if (count == k) {
                        flag = false;
                        i = i + k - 1;
                        continue;
                    }
                }
                sub.append(s.charAt(i));
            }
            s = sub.toString();
            if (flag)
                break;
        }
        return s;
    }
  1. 棧:我用雙棧做的,實際上用Pair更方便(我傻了……完全忘了pair)
    public String removeDuplicates(String s, int k) {
        if (s.length() < k)
            return s;
        Stack<Character> stack = new Stack<>();
        Stack<Integer> stack1 = new Stack<>();
        stack.add(s.charAt(0));
        stack1.add(1);
        for (int i = 1; i < s.length(); i++) {
            if (!stack.empty() && stack.peek() == s.charAt(i)) {
                stack1.add(stack1.peek() + 1);
            } else
                stack1.add(1);
            stack.add(s.charAt(i));
            if (stack1.peek() == k) {
                for (int j = 0; j < k; j++) {
                    stack.pop();
                    stack1.pop();
                }
            }
        }
        StringBuilder res = new StringBuilder();
        while (!stack.empty()) {
            res.insert(0, stack.pop());
        }
        return res.toString();
    }