加载中...
1047-删除字符串中的所有相邻重复项(Remove All Adjacent Duplicates In String)
发表于:2021-12-03 | 分类: 简单
字数统计: 904 | 阅读时长: 4分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string

英文原文

You are given a string s consisting of lowercase English letters. A duplicate removal consists of choosing two adjacent and equal letters and removing them.

We repeatedly make duplicate removals on s until we no longer can.

Return the final string after all such duplicate removals have been made. It can be proven that the answer is unique.

 

Example 1:

Input: s = "abbaca"
Output: "ca"
Explanation: 
For example, in "abbaca" we could remove "bb" since the letters are adjacent and equal, and this is the only possible move.  The result of this move is that the string is "aaca", of which only "aa" is possible, so the final string is "ca".

Example 2:

Input: s = "azxxzy"
Output: "ay"

 

Constraints:

  • 1 <= s.length <= 105
  • s consists of lowercase English letters.

中文题目

给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

 

示例:

输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。

 

提示:

  1. 1 <= S.length <= 20000
  2. S 仅由小写英文字母组成。

通过代码

高赞题解

图解每日一练.jpg


🧠 解题思路

根据题意的充分理解,我们可分析如下:

  1. 多组相邻重复项,我们无论先删除哪一项,都不会影响最终结果。
  2. 删除当前项是需要拿上一项出来对比的,所以我们需要用临时栈存放之前的内容。
  3. 当前项和栈顶一致,弹出栈顶抵消即可。若不一致,压入栈留存,供后续使用。

🎨 图解演示

 <1@2x.png,2@2x.png,3@2x.png,4@2x.png,5@2x.png,6@2x.png>


🍭 示例代码

[]
var removeDuplicates = function(S) { let stock = []; for(let item of S){ if(stock[stock.length - 1] === item){ stock.pop(); }else{ stock.push(item); } } return stock.join(""); };
[]
class Solution { public: string removeDuplicates(string S) { string stk; for (char ch : S) { if (!stk.empty() && stk.back() == ch) { stk.pop_back(); } else { stk.push_back(ch); } } return stk; } };
[]
class Solution { public String removeDuplicates(String S) { StringBuffer stack = new StringBuffer(); int top = -1; for (int i = 0; i < S.length(); ++i) { char ch = S.charAt(i); if (top >= 0 && stack.charAt(top) == ch) { stack.deleteCharAt(top); --top; } else { stack.append(ch); ++top; } } return stack.toString(); } }
[]
class Solution: def removeDuplicates(self, S: str) -> str: stk = list() for ch in S: if stk and stk[-1] == ch: stk.pop() else: stk.append(ch) return "".join(stk)
[]
func removeDuplicates(s string) string { stack := []byte{} for i := range s { if len(stack) > 0 && stack[len(stack)-1] == s[i] { stack = stack[:len(stack)-1] } else { stack = append(stack, s[i]) } } return string(stack) }
[]
char* removeDuplicates(char* S) { int n = strlen(S); char* stk = malloc(sizeof(char) * (n + 1)); int retSize = 0; for (int i = 0; i < n; i++) { if (retSize > 0 && stk[retSize - 1] == S[i]) { retSize--; } else { stk[retSize++] = S[i]; } } stk[retSize] = '\0'; return stk; }

转身挥手

嘿,少年,做图不易,留下个赞或评论再走吧!谢啦~ 💐

差点忘了,祝你牛年大吉 🐮 ,AC 和 Offer 📑 多多益善~

⛲⛲⛲ 期待下次再见~

统计信息

通过次数 提交次数 AC比率
113389 156553 72.4%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
1046-最后一块石头的重量(Last Stone Weight)
下一篇:
1048-最长字符串链(Longest String Chain)
本文目录
本文目录