博客
关于我
【Leetcode】1544. Make The String Great
阅读量:526 次
发布时间:2019-03-07

本文共 1709 字,大约阅读时间需要 5 分钟。

解析字符串处理问题:递归删除特定字符子串

问题描述

给定一个仅包含英文字母的字符串,要求递归删除所有满足以下条件的相邻字符对:这对字符分别是某个字母的不同大小写形式。具体而言,若字符串中存在相邻两个字符,一个为大写字母,另一个为小写字母,且它们的字母相同,则这对字符可以被删除。处理完成后,返回最终的字符串结果。题目保证答案唯一。

代码解析

为了实现上述功能,以下Java代码提供了一种解决方案:

public class Solution {    public String makeGood(String s) {        StringBuilder sb = new StringBuilder();        for (int i = 0; i < s.length(); i++) {            char ch = s.charAt(i);            if (sb.length() > 0 && Math.abs(sb.charAt(sb.length() - 1) - ch) == 'a' - 'A') {                sb.setLength(sb.length() - 1);            } else {                sb.append(ch);            }        }        return sb.toString();    }}

工作原理

  • StringBuilder初始化:使用StringBuilder来构建结果字符串,确保字符操作的高效性。
  • 遍历字符串:逐个字符遍历输入字符串。
  • 字符比较:对于当前字符ch,检查StringBuilder的最后一个字符sb.charAt(sb.length() - 1)
    • 条件满足:如果两个字符的ASCII码差的绝对值等于32(即'a' - 'A'),说明它们是一个大写字母和一个小写字母,且字母相同。此时,删除StringBuilder的最后一个字符。
    • 条件不满足:否则,将当前字符追加到StringBuilder中。
  • 返回结果:遍历结束后,返回StringBuilder构建的字符串。
  • 代码正确性验证

    为了确认代码的正确性,我们可以通过多个示例进行验证:

  • 示例1:输入字符串为"AbBA"

    • 处理过程:
      • A添加,sb = "A"
      • bAb的ASCII码差为33,不满足条件,追加,sb = "Ab"
      • BbB的ASCII码差为32,满足条件,删除Bsb = "A".
      • AAA的ASCII码差为0,不满足条件,追加,sb = "AA"
    • 结果:"AA"
  • 示例2:输入字符串为"aBcAb"

    • 处理过程:
      • a添加,sb = "a"
      • BaB的ASCII码差为31,不满足条件,追加,sb = "aB"
      • cBc的ASCII码差为34,不满足条件,追加,sb = "aBc"
      • AcA的ASCII码差为33,不满足条件,追加,sb = "aBcA"
      • bAb的ASCII码差为33,不满足条件,追加,sb = "aBcAb"
    • 结果:"aBcAb"
  • 示例3:输入字符串为"BabA"

    • 处理过程:
      • B添加,sb = "B"
      • aBa的ASCII码差为32,满足条件,删除asb = "B"
      • bBb的ASCII码差为32,满足条件,删除bsb = "B"
      • ABA的ASCII码差为1,不满足条件,追加,sb = "BA"
    • 结果:"BA"
  • 优化分析

    时间复杂度

    代码遍历字符串一次,时间复杂度为O(n),其中n是字符串的长度。空间复杂度同样为O(n),因为StringBuilder用于存储结果字符串。

    优缺点

    • 优点:代码简洁,时间复杂度高效,空间复杂度线性。
    • 缺点:在某些情况下,可能会错误地删除不符合条件的字符对。

    总结

    通过上述分析,可以确认提供的代码能够正确地处理字符串中的相邻字符对,删除符合条件的字符子串。该算法的时间和空间复杂度均为O(n), 使其在处理较长字符串时表现优异。

    转载地址:http://trfnz.baihongyu.com/

    你可能感兴趣的文章
    Pandas 根据布尔条件选择行和列
    查看>>
    pandas 滚动窗口 - datetime64[ns] 未实现
    查看>>
    pandas 版本兼容特定的蟒蛇和NumPy配置吗?
    查看>>
    pandas 生成excel多级表头
    查看>>
    Pandas 的 DataFrame 详解-ChatGPT4o作答
    查看>>
    pandas 读取excel数据,以字典形式输出
    查看>>
    Pandas 读取具有浮点值的 csv 文件会导致奇怪的舍入和小数位数
    查看>>
    pandas 适用,但仅适用于满足条件的行
    查看>>
    pandas 重新采样到每月的特定工作日
    查看>>
    pandas :我如何对堆叠的条形图进行分组?
    查看>>
    pandas :按移位分组和累加和(GroupBy Shift And Cumulative Sum)
    查看>>
    pandas :检测一个DF和另一个DF之间缺失的列
    查看>>
    Pandas-从具有嵌套列表列表的现有列创建动态列时出错
    查看>>
    Pandas-通过对列和索引的值求和来合并两个数据框
    查看>>
    pandas.columns、get_dummies等用法
    查看>>
    pandas.DataFrame.copy(deep=True) 实际上并不创建深拷贝
    查看>>
    pandas.read_csv()的详解-ChatGPT4o作答
    查看>>
    PANDAS.READ_EXCEL()输出‘;溢出错误:日期值超出范围‘;而不存在日期列
    查看>>
    pandas100个骚操作:再见 for 循环!速度提升315倍!
    查看>>
    Pandas:如何根据其他列值的条件对列进行求和?
    查看>>