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

这篇具有很好参考价值的文章主要介绍了算法:删除字符串中的所有相邻重复项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、问题描述

二、栈解法

三、双指针解法

总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、问题描述

给出由小写字母组成的字符串str,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在str上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

输入:"abbaca"
输出:"ca"

str 仅由小写英文字母组成

二、栈解法

解题思路:

可以将要比较的对象压栈,然后用将要比较的对象和栈顶元素比较,相同的话,栈顶元素出栈,不相同,则把将要比较的对象入栈,作为新的栈顶元素。当栈顶元素弹出后,前一个元素就变成了新的栈顶元素。

代码示例:

public void test() {
    // 存储遍历到不相同的字符
    Stack<Character> stack = new Stack<>();
    String str = "abbaca";
    int i = 0;
    while(i++ < str.length()) {
        // 从第一个字符开始
        char charAt = str.charAt(i - 1);
        // 如果栈是空的或者当前字符与栈顶元素不相同, 则入栈, 要注意, stack的peek操作, 如果栈是空的则抛异常
        if (stack.isEmpty() || !Objects.equals(charAt, stack.peek())) {
            stack.push(charAt);
            continue;
        }
        // 如果栈非空且当前字符与栈顶元素相同, 则出栈
        stack.pop();
    }
    StringBuffer sb = new StringBuffer();
    while(!stack.isEmpty()) {
        sb.append(stack.pop());
    }
    // 字符反转, 并输出
    System.out.println(sb.reverse());
}

三、双指针解法

解题思路:

对于对称的字符串来说,有一个规律,从中间开始,向左移动一位和向右移动一位的元素是相同的,可以成对的删除。正常情况下,每次左右指针都从同一个位置出发,然后右指针先行一步,然后再对比两个指针元素的值。这个过程中有特殊情况需要处理,首先是左指针已经移动到头了;其次是怎么删除元素。因为在整个过程中,有可能删除的是整个字符串的某些部分,然后就将字符串分割为好几段,最终我们需要的恰恰又是一个完整的字符串。

代码示例:

public void test() {
    int left = 0;
    int right = 0;
    String str = "abbaca";
    char[] chars = str.toCharArray();
    while(right < str.length() - 1) {
        // 右指针向右移动, 和left拉开距离
        right++;
        // 如果值相同, 则进行删除
        if (chars[right] == chars[left]) {
            // 对应位置打标记, 随后删除
            chars[right] = 0;
            // 对应位置打标记, 随后删除
            chars[left] = 0;
            // 如果left已经到左边尽头了, 则重置left, 将left设为和right一样的起点
            if (left == 0) {
                left = ++right;
                continue;
            }
            // left未到左边尽头, left向左移动一位
            left = left - 1;
            continue;
        }
        // 元素不相同, left向右移动, 和right保持相同的起始位置
        left = right;
    }
    // 最终输出的内容里, 替换掉标记
    System.out.println(JSON.toJSONString(chars).replace("\\u0000", ""));
}

总结

注释已添加,多想多练,简单到有手就行!文章来源地址https://www.toymoban.com/news/detail-815197.html

到了这里,关于算法:删除字符串中的所有相邻重复项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法训练day11Leetcode20有效的括号1047删除字符串中所有相邻重复项150逆波兰表达式求值

    https://leetcode.cn/problems/valid-parentheses/description/ https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html 判断右括号后忘记pop 括号匹配是使用栈解决的经典问题。 如果还记得编译原理的话,编译器在 词法分析的过程中处理括号、花括号等这个符号的逻辑,也是使用了栈

    2024年01月17日
    浏览(76)
  • 代码随想录复习 1047. 删除字符串中的所有相邻重复项 150 逆波兰表达式求值 239 滑动窗口最大值

    1047. 删除字符串中的所有相邻重复项 代码如下  func removeDuplicates(s string) string {             var  stack []byte   //结果栈数组             for i := 0 ; i  len(s) ; i++ {                 if len(stack)  0  stack[len(stack)-1] == s[i] {  //如果当前遍历到的元素

    2024年02月05日
    浏览(71)
  • day11 代码回想录-栈与队列part02-有效的括号&删除字符串中的所有相邻重复项&逆波兰表达式求值

    大纲 ● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值 有效的括号 题目链接:20. 有效的括号 题目需要判断括号是否匹配 解题思路: 使用栈来实现,当为**{[( 时入栈,当遇到 )]} 时,判断栈顶元素释放能匹配。需要单独处理只有 右边**单个

    2024年02月11日
    浏览(59)
  • 代码随想录第十一天 | ​​​​​​LeetCode 20. 有效的括号、​​​​​​LeetCode 1047. 删除字符串中的所有相邻重复项、​​​​​​LeetCode 150. 逆波兰表达式求

    目录 ​​​​​​LeetCode 20. 有效的括号 文章讲解:代码随想录(programmercarl.com) 视频讲解:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili 思路 ​​​​​​LeetCode 1047. 删除字符串中的所有相邻重复项 文章讲解:代码随想录(programmercarl.com) 视频讲解:栈的好戏还

    2024年02月22日
    浏览(79)
  • 代码随想录Day9 栈与队列 LeetCodeT20 有效的括号 T1047 删除字符串中所有相邻重复项 T150 逆波兰表达式求值

    题目详细思路和解法来自于:代码随想录 (programmercarl.com) 这道题分为三种情况 1.左括号多了         ([{}]() 2.括号不匹配         [{(]}] 3.右括号多了         []{}()))) 处理思路:我们在遇到左括号的时候,直接入栈其对应的右括号即可,然后在遇到右括号的时候直接与栈顶元素比

    2024年02月06日
    浏览(163)
  • C语言实现删除字符串中重复字符的算法

    C语言实现删除字符串中重复字符的算法 问题描述: 给定一个字符串,我们需要编写一个C语言函数,以删除字符串中的重复字符。例如,对于输入字符串\\\"hello world\\\",函数应该返回\\\"hel wrd\\\"。 算法思路: 为了解决这个问题,我们可以使用一个哈希表来跟踪每个字符的出现次数。

    2024年02月04日
    浏览(45)
  • 算法刷题-字符串-重复的子字符串

    KMP算法还能干这个 力扣题目链接 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 示例 1: 输入: “abab” 输出: True 解释: 可由子字符串 “ab” 重复两次构成。 示例 2: 输入: “aba” 输出: False 示

    2024年02月09日
    浏览(53)
  • js删除字符串中的指定字符串

    `replace()` 将字符串中的指定子字符串替换为新的字符串。         如果删除指定的子字符串,可以将它替换为空字符串。 删除str中的“World”,结果为:   2.1 删除字符串中的所有匹配的子字符串 删除str中所有的“Hello”,结果为: 2.2 删除字符串中的第一个匹配的子字符

    2024年02月10日
    浏览(47)
  • 【每日挠头算法题(3)】字符串解码|数组中重复的数字

    点我直达~ 这道题怎么看都好像是用栈来实现,因为有左右括号。(可是第一时间我没想到) 遍历字符串,此时会有几种情况: 1.如果是数字字符,给一个 num 变量,将该字符转化成数字存储起来。 2.如果是字母(题目说只可能是小写),给一个字符串 str ,将该字母存储到字符

    2024年02月08日
    浏览(57)
  • LeetCode:459. 重复的子字符串 —【2、KMP算法】

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题目描述 :给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 来源:力扣(LeetCode) 难度: 简单 提示: 1 = s.length = 104 s 由小写英文字母组成 示例 1: 输入:

    2024年02月04日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包