LeetCode刷题之1209.删除字符串中的所有相邻重复项 II
我不知道将去向何方,但我已在路上! |
---|
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! |
- 题目:
给你一个字符串 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"
-
提示:
• 1 <= s.length <= 10^5
• 2 <= k <= 10^4
• s中只含有小写英文字母。 -
代码:
class Solution:
def removeDuplicates(self, s: str, k: int) -> str:
a,b,result = [],[],""
for i in range(len(s)):
if a == [] or a[-1] != s[i]:
a.append(s[i])
b.append(1)
elif b[-1] < k:
b[-1] += 1
if b[-1] == k:
a.pop()
b.pop()
for i in range(len(a)):
result += a[i] * b [i]
return result
# 执行用时 :76 ms, 在所有 Python3 提交中击败了89.11%的用户
# 内存消耗 :14.7 MB, 在所有 Python3 提交中击败了100.00%的用户
- 算法说明:
建立两个列表a和b,分别存储字母,和对应的字母个数;用for循环遍历s中的元素,第一个if,如果列表a为空,或者列表a的最后一个字母与当前遍历的字母不一样,将当前字母添加到a中,并在b中记录个数(在b中添加一个1);第二个if,在第一个if条件不满足的情况下执行(也就是当前元素和a中的最后一个元素一样),判断b的最后一个元素是否小于k,如果小于,将最后一个元素+1;在前两个if不满足的条件下,执行第三个if,说明满足有连续k个一样的字母,满足出栈的条件,a和b分别出栈,继续循环。执行完第一个for循环,执行第二个for循环,将对应个数为b[i]的a[i]所表示的字母,添加到result中,输出result。具体过程如下: