LeetCode——刪除字串中的所有相鄰重複項 II
阿新 • • 發佈:2020-08-01
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:
- 暴力解:
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; }
- 棧:我用雙棧做的,實際上用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(); }