LeetCode刷题之1209.删除字符串中的所有相邻重复项 II

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。具体过程如下:
    在这里插入图片描述
发布了90 篇原创文章 · 获赞 1 · 访问量 1055

猜你喜欢

转载自blog.csdn.net/qq_34331113/article/details/102497862