zoukankan      html  css  js  c++  java
  • 栈-删除字符串问题

    1047. 删除字符串中的所有相邻重复项
    给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
    在 S 上反复执行重复项删除操作,直到无法继续删除。
    在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
    
    输入:"abbaca"
    输出:"ca"
    解释:
    例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca"
    其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"1)使用双倍的字母建立字典 2)一次次遍历,删除重复的字符 from string import ascii_lowercase class Solution: def removeDuplicates(self, S: str) -> str: # generate 26 possible duplicates duplicates = {2 * ch for ch in ascii_lowercase} prev_length = -1 while prev_length != len(S): prev_length = len(S) for d in duplicates: S = S.replace(d, '') return S class Solution: def removeDuplicates(self, S: str) -> str: output = [] for ch in S: if output and ch == output[-1]: output.pop() else: output.append(ch) return ''.join(output)
    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"
    解法:(a,a的个数)
    
    class Solution:
        def removeDuplicates(self, s: str, k: int) -> str:
            n = len(s)
            stack = []
            for c in s:
                if not stack or stack[-1][0] != c:
                    stack.append([c, 1])
                elif stack[-1][1] + 1 < k:
                    stack[-1][1] += 1
                else:
                    stack.pop()
            ans = ""
            for c, l in stack:
                ans += c * l
            return ans
    316. 去除重复字母
    给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
    示例 1:
    
    输入: "bcabc"
    输出: "abc"
    示例 2:
    
    输入: "cbacdcbc"
    输出: "acdb"
    
    class Solution:
        def removeDuplicateLetters(self, s) -> int:
            stack = []
            remain_counter = collections.Counter(s)
            for c in s:
                if c not in stack:
                    while stack and c < stack[-1] and  remain_counter[stack[-1]] > 0:
                        stack.pop()
                    stack.append(c)
                remain_counter[c] -= 1
            return ''.join(stack)
    402. 移掉K位数字
    给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
    
    注意:
    
    num 的长度小于 10002 且 ≥ k。
    num 不会包含任何前导零。
    示例 1 :
    
    输入: num = "1432219", k = 3
    输出: "1219"
    解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。
    示例 2 :
    
    输入: num = "10200", k = 1
    输出: "200"
    解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
    
    class Solution:
        def removeKdigits(self, num: str, k: int) -> str:
            remain = len(num)-k
            stack = []
            for i in num:
                while k and stack and stack[-1]>i:
                    stack.pop()
                    k -= 1
                stack.append(i)
            return "".join(stack[:remain]).lstrip("0") or "0"
            
  • 相关阅读:
    ios xib或storyBoard的那些小方法
    ios pod库更新到1.0或1.0.1之正确修改podfile文件
    ios UILabel在storyBoard或xib中如何在每行文字不显示完就换行
    ios NSThred多线程简单使用
    Xcode升级插件失效,与添加插件不小心点击Skip Bundle解决办法
    ios app打ipa包
    极光推送碰到的问题
    ios 更新约束
    ios 缺少合规证明
    Path Sum II
  • 原文地址:https://www.cnblogs.com/topass123/p/13397557.html
Copyright © 2011-2022 走看看