本文共 1722 字,大约阅读时间需要 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来构建结果字符串,确保字符操作的高效性。ch,检查StringBuilder的最后一个字符sb.charAt(sb.length() - 1)。 'a' - 'A'),说明它们是一个大写字母和一个小写字母,且字母相同。此时,删除StringBuilder的最后一个字符。StringBuilder中。StringBuilder构建的字符串。为了确认代码的正确性,我们可以通过多个示例进行验证:
示例1:输入字符串为"AbBA"。
A添加,sb = "A"。b:A和b的ASCII码差为33,不满足条件,追加,sb = "Ab"。B:b和B的ASCII码差为32,满足条件,删除B,sb = "A".A:A和A的ASCII码差为0,不满足条件,追加,sb = "AA"。"AA"。示例2:输入字符串为"aBcAb"。
a添加,sb = "a"。B:a和B的ASCII码差为31,不满足条件,追加,sb = "aB"。c:B和c的ASCII码差为34,不满足条件,追加,sb = "aBc"。A:c和A的ASCII码差为33,不满足条件,追加,sb = "aBcA"。b:A和b的ASCII码差为33,不满足条件,追加,sb = "aBcAb"。"aBcAb"。示例3:输入字符串为"BabA"。
B添加,sb = "B"。a:B和a的ASCII码差为32,满足条件,删除a,sb = "B"。b:B和b的ASCII码差为32,满足条件,删除b,sb = "B"。A:B和A的ASCII码差为1,不满足条件,追加,sb = "BA"。"BA"。代码遍历字符串一次,时间复杂度为O(n),其中n是字符串的长度。空间复杂度同样为O(n),因为StringBuilder用于存储结果字符串。
通过上述分析,可以确认提供的代码能够正确地处理字符串中的相邻字符对,删除符合条件的字符子串。该算法的时间和空间复杂度均为O(n), 使其在处理较长字符串时表现优异。
转载地址:http://trfnz.baihongyu.com/