【leetcode】1209. Remove All Adjacent Duplicates in String II
题目如下:
Given a string
s, a k duplicate removal consists of choosingkadjacent and equal letters fromsand removing them causing the left and the right side of the deleted substring to concatenate together.We repeatedly make
kduplicate removals onsuntil we no longer can.Return the final string after all such duplicate removals have been made.
It is guaranteed that the answer is unique.
Example 1:
Input: s = "abcd", k = 2 Output: "abcd" Explanation: There's nothing to delete.Example 2:
Input: s = "deeedbbcccbdaa", k = 3 Output: "aa" Explanation: First delete "eee" and "ccc", get "ddbbbdaa" Then delete "bbb", get "dddaa" Finally delete "ddd", get "aa"Example 3:
Input: s = "pbbcggttciiippooaais", k = 2 Output: "ps"Constraints:
1 <= s.length <= 10^52 <= k <= 10^4sonly contains lower case English letters.
解题思路:本题解法不难,利用入栈出栈的思路即可。但有几点注意一下,一是只有长度为k的连续出现的相同的字符才能消除,如果有(k+1)个字符a的话,只能消除k个,留下剩余的一个a;同时注意消除后的相同字符的合并。
代码如下:
class Solution(object): def removeDuplicates(self, s, k): """ :type s: str :type k: int :rtype: str """ stack = [] s += '#' last_char = None continuous = 1 for i in s: if last_char == None: last_char = i elif last_char == i: continuous += 1 else: stack.append([last_char,continuous]) last_char = i continuous = 1 #print stack for i in range(len(stack)-1,-1,-1): if stack[i][1] >= k: if stack[i][1] % k == 0: del stack[i] else: stack[i][1] = stack[i][1] % k if i < len(stack) - 1 and stack[i][0] == stack[i+1][0]: stack[i][1] += stack[i+1][1] del stack[i+1] if i < len(stack) and stack[i][1] >= k: if stack[i][1] % k == 0: del stack[i] else: stack[i][1] = stack[i][1] % k res = '' for char,count in stack: res += char*count return res
浙公网安备 33010602011771号