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"
本文来自博客园,作者:topass123,转载请注明原文链接:https://www.cnblogs.com/topass123/p/13397557.html