09_删除字符串中的所有相邻重复项

删除,字符串,所有,相邻,重复 · 浏览次数 : 0

小编点评

**方法一** ```java class Solution { public String removeDuplicates(String s) { ArrayDeque deque = new ArrayDeque<>(); char ch; for (int i = 0; i < s.length(); i++) { ch = s.charAt(i); if (!deque.isEmpty() && ch == deque.peek()) { deque.removeLast(); } else { deque.add(ch); } } String new_s = ""; while (!deque.isEmpty()) { new_s = deque.pop() + new_s; } return new_s; } } ``` **方法二** ```java class Solution { public String removeDuplicates(String s) { StringBuffer res = new StringBuffer(); int top = -1; for (int i = 0; i < s.length(); ++i) { char c = s.charAt(i); if (top > 0 && c == res.charAt(top)) { res.deleteCharAt(top); top--; } else { res.append(c); top++; } } return res.toString(); } } ``` **提示** * 方法一使用 ArrayDeque 存储字符,并使用 `pop()` 方法从栈中获取相邻字符。 * 方法二使用 StringBuffer 存储字符,并使用 `deleteCharAt()` 方法从字符串中删除相邻字符。 * 两个方法都保证最终返回的结果是唯一。

正文

删除字符串中的所有相邻重复项

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

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

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

示例:

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

提示:

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

【思路】

第一种方法的思路我也想到了,就是在最后字符串的拼接操作出现了问题,没有完整的写出来。

本题也是用栈来解决的经典问题。

代码实现如下:

class Solution {
    public String removeDuplicates(String s) {
       //ArrayDeque会比LinkedList在除了删除元素这一点外会快一点
        //参考:https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlist
        ArrayDeque<Character> deque = new ArrayDeque<>();
        char ch;
         for (int i = 0; i < s.length(); i++) {
            ch = s.charAt(i);
             // stack不为空并且当前字符和栈顶元素相同,则栈顶元素出栈
            if (!stack.isEmpty() && ch == stack.peek()) {
                stack.pop();
            } else {
                stack.push(ch);
            }
         }
        String new_s = "";
        // stack中的元素和目标元素正好是反过来的,直接每次在new_s之前做拼接操作,最后得到的就是目标结果
        while(!stack.isEmpty()) {
            new_s = stack.pop() + new_s;
        }
        return new_s;
    }
}

方法二

class Solution {
    public String removeDuplicates(String s) {
        // 方法二:直接拿字符串当栈来用
        // 将res当做栈
        // 也可以用StringBuilder来修改字符串,速度更快
        StringBuffer res = new StringBuffer();
        // top为res的长度
        int top = -1;
        for (int i = 0; i < s.length(); ++i) {
            char c = s.charAt(i);
            // 当top>0,即栈中有字符时,当前字符如果和栈中字符相等,弹出栈顶字符,同时top--
            if (top >= 0 && res.charAt(top) == c) {
                res.deleteCharAt(top);
                top--;
                // 否则,将该字符入栈,同时top++
            } else {
                res.append(c);
                top++;
            }
        }
        return res.toString();
    }
}

与09_删除字符串中的所有相邻重复项相似的内容:

09_删除字符串中的所有相邻重复项

删除字符串中的所有相邻重复项 【题目】给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。本题对应于leetcode 1047 示例: 输入:"abba

(转载)自动化测试在美团外卖的实践与落地

(转载)自动化测试在美团外卖的实践与落地 侵删 原文链接: https://tech.meituan.com/2022/09/15/automated-testing-in-meituan.html 美团这个技术博客不少内容都不错的,推荐阅读 1. 项目背景 美团外卖的业务场景比较多元化,除了外卖自

09_分割等和子集

416. 分割等和子集 题目难易:中等 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [1, 5, 11, 5] 输出: true 解释: 数组可以分割成 [1,

09. C语言内嵌汇编代码

C语言函数内可以自定义一段汇编代码,在GCC编译器中使用 asm 或 __asm__ 关键词定义一段汇编代码,并可选添加volatile关键字,表示不要让编译器优化这段汇编代码。 内嵌汇编代码格式如下: __asm__ ( "汇编代码" :输出描述 :输入描述 :修改描述 ); 汇编代码部分 汇编代

[转帖]DM8 达梦数据库 查看数据库版本号 方法

2020-09-28 17:24183572原创DM 达梦 本文链接:https://www.cndba.cn/dave/article/4260 在DM7 中,查询数据库版本号的方法和Oracle 一样,通过v$version 视图可以查询。 [dmdba@www.cndba.cn ~]$ dis

2023-09-30:用go语言,给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1, 每一次移动,你可以选择 相邻 两个数字并将它们交换。 请你返回使 nums 中包含 k

2023-09-30:用go语言,给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1, 每一次移动,你可以选择 相邻 两个数字并将它们交换。 请你返回使 nums 中包含 k 个 连续 1 的 最少 交换次数。 输入:nums = [1,0,0,1,0,1], k = 2。

文件系统(六):一文看懂linux ext4文件系统工作原理

liwen01 2024.06.09 前言 Linux系统中的ext2、ext3、ext4 文件系统,它们都有很强的向后和向前兼容性,可以在数据不丢失的情况下进行文件系统的升级。目前ext4是一个相对较成熟、稳定且高效的文件系统,适用于绝大部分规模和需求的Linux环境。 ext4它突出的特点有:数

[转帖]DM 达梦数据库 记录超长 错误解决方法

2022-08-24 09:423551原创DM 达梦 本文链接:https://www.cndba.cn/dave/article/108596 1 问题说明与分析 在达梦数据库中进行数据库Insert时可能会遇到如下错误: java.sql.SQLException: Record length

[转帖]SQL Server 内部数据库版本 及兼容表

2022-04-20 09:043100转载SQLServer Microsoft SQL Server 的较新版本创建的数据库无法附加或还原到较早的版本。之所以存在此限制,是因为较旧的版本不知道新版本中引入的文件格式有哪些变更。 如果你尝试将数据库附加到早期版本、或者还原到早期版本,将会收到 SQ

[转帖]openEuler 22.09 正式版发布:实现欧拉与鸿蒙的互联互通

https://www.ithome.com/0/644/648.htm IT之家 10 月 2 日消息,据 openEuler 发布,openEuler 是数字基础设施的开源操作系统,openEuler 22.09 是社区构建的最新创新版本,释放多样性算力,深化全场景创新,实现欧拉与鸿蒙的互联互通