题解 [476.相邻字母匹配计数问题 & 477.相邻重复字母删除问题] | 豆包MarsCode AI 刷题

63 阅读1分钟

下面是两道相邻字母的问题,不明白为什么这两道题的标签有中等难度,感觉标签有点标高了

476 问题描述

小F有一个由大写字母和小写字母组成的字符串。她想知道,在忽略字母大小写的情况下,有多少对相邻的字母是相等的。

例如,对于字符串 "aABbbC",在忽略大小写的情况下,有 3 对相邻字母是相等的,分别是 "aA""AB""bb"

思路

读完题目我们可以知道,给定一个字符串,在忽略大小写的情况下,我们需要输出有多少对相邻字母是相同的

所以我们只需要下标 i 从 1 开始枚举 i 和 i - 1,判断他们是否在忽略大小写的情况下是相同的

这里由于给定的字符串只包含大小写字母,甚至不需要额外的特殊处理,直接利用 Java Character 类中 Character.toLowerCase() 可以将传入的字符转换为小写字符,将 i 和 i - 1 的字符都转换为小写,之后判断是否相同,相同,则计数器 + 1;不同,则继续枚举

枚举 i 从 1 到 s.length()

最后返回计数器即为答案

复杂度

时间复杂度:

O(N)

对于给定的数组,每个字符被记录一次

空间复杂度:

O(1)

仅使用个别变量用于计数器 O(1)

代码

 public class Main {     public static int solution(String s) {         int count = 0;         char[] str = s.toCharArray();         for (int i = 1; i < str.length; i++) {             if (Character.toLowerCase(str[i]) == Character.toLowerCase(str[i - 1])) count++;         }         return count;     } ​     public static void main(String[] args) {         System.out.println(solution("aABbbC") == 3);         System.out.println(solution("XYZxyZ") == 0);         System.out.println(solution("AaBbCc") == 3);     } }

477 问题描述

小M拿到了一个由小写字母组成的字符串 s。她发现可以进行一种操作:选择两个相邻且相同的字母并删除它们。她可以在 s 上反复进行此操作,直到无法再删除任何字母。

请返回最终处理完所有重复项删除操作后的字符串。可以保证返回的答案是唯一的。

思路

读完题目我们知道,如果有两个字符 a 和 a 相邻,那么他们可以被删除,如果删除之后还有相同字符相邻,那么可以继续删除

很类似于括号匹配 ( 和 ),就相当于匹配,而且是更加简单一些的括号匹配,因为括号分左右,但是字符相同即可

所以我们可以使用类似的思路

维护一个栈,枚举给定字符串的每一个字符

  • 如果当前栈为空或者当前字符与栈顶元素不同,将当前字符压入栈

  • 如果当前栈顶字符与当前字符相同,弹出栈顶元素

最后将栈中剩余字符弹出转化为字符串返回即可

复杂度

时间复杂度:

O(N)

对于给定的数组,每个字符被枚举一次

空间复杂度:

O(N)

最坏情况,所有字符都没有删除,栈空间为字符串长度

代码

 import java.util.*; public class Main {     public static String solution(String s) {         char[] str = s.toCharArray();         Deque<Character> stack = new LinkedList<>();         for (int i = 0; i < str.length; i++) {             if (stack.isEmpty() || str[i] != stack.peek()) stack.addFirst(str[i]);             else stack.removeFirst();         }         StringBuilder sb = new StringBuilder();         while (!stack.isEmpty()) sb.append(stack.removeLast());         return sb.toString();     } ​     public static void main(String[] args) {         System.out.println(solution("abbaca").equals("ca"));         System.out.println(solution("azxxzy").equals("ay"));         System.out.println(solution("a").equals("a"));     } }