开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 29 天,点击查看活动详情
题目:LeetCode
给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母,则返回一个空字符串。
最好 英文字母的大写和小写形式必须 都 在 s 中出现。
英文字母 b 比另一个英文字母 a 更好 的前提是:英文字母表中,b 在 a 之 后 出现。
示例 1:
输入: s = "lEeTcOdE"
输出: "E"
解释:
字母 'E' 是唯一一个大写和小写形式都出现的字母。
示例 2:
输入: s = "arRAzFif"
输出: "R"
解释:
字母 'R' 是大写和小写形式都出现的最好英文字母。
注意 'A' 和 'F' 的大写和小写形式也都出现了,但是 'R' 比 'F' 和 'A' 更好。
示例 3:
输入: s = "AbCdEfGhIjK"
输出: ""
解释:
不存在大写和小写形式都出现的字母。
提示:
1 <= s.length <= 1000s由小写和大写英文字母组成
解题思路
由题意分析可通过如下方法处理
将字符按照大小分成两组,并按照字母进行计数。最后从后向前遍历,大小字母表中出现次数均大于0的字符即可。
但推荐以下简便一些的方法
- 循环字符串,并把每个字符转换成数字,存入到set中
- 查看ASCII码,根据ASCII表得出,大小写相差32,比如a为97,A为65。把小写字符过滤出来(大于96),如果ig-32存在,说明小写字母存在对应的大写字母,并用Math.max寻找最大值。
代码实现
public String greatestLetter(String s) {
Set < Integer > set = new HashSet < > ();
for (int i = 0; i < s.length(); i++) {
set.add((int) s.charAt(i));
}
int it = 0;
for (Integer ig: set) {
if (ig > 96) {
if (set.contains(ig - 32)) {
it = Math.max(it, ig - 32);
}
}
}
return it == 0 ? "" : String.valueOf((char) it);
}
运行结果
复杂度分析
- 空间复杂度:
- 时间复杂度:
在掘金(JUEJIN) 一起分享知识, Keep Learning!