下面是两道相邻字母的问题,不明白为什么这两道题的标签有中等难度,感觉标签有点标高了
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")); } }