携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
刷题的日常
一天一题,保持脑子清爽
兼具大小写的最好英文字母
来自leetcode的 2309 题,题意如下:
给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母,则返回一个空字符串。
最好 英文字母的大写和小写形式必须 都 在 s 中出现。
英文字母 b 比另一个英文字母a更好 的前提是:英文字母表中,b 在 a 之 后 出现。
示例如下:
输入:s = "lEeTcOdE"
输出:"E"
解释:
字母 'E' 是唯一一个大写和小写形式都出现的字母。
输入:s = "arRAzFif"
输出:"R"
解释:
字母 'R' 是大写和小写形式都出现的最好英文字母。
注意 'A' 和 'F' 的大写和小写形式也都出现了,但是 'R' 比 'F' 和 'A' 更好。
输入:s = "AbCdEfGhIjK"
输出:""
解释:
不存在大写和小写形式都出现的字母。
理解题意
我们可以从题意中提取的条件如下:
- 在题目给出的字符串中
- 查找大小写都出现的字符
- 如果存在多个大小写都出现的字符
- 返回字典序最大的一个
- 没有的话返回空
- 返回的要是大写字符
做题思路
第一想法是通过Map记录出现的字符,如果大小写都有出现,那么就作为返回值存在一个变量当中。记录出现时,比较字典序,如果字典序比较大,那么覆盖前一个值。
代码实现
代码实现也很简单,如下:
public class Solution {
public String greatestLetter(String s) {
boolean[] map = new boolean[26 * 2];
char result = 'A' - 1;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'A' && c <='Z') {
map[c - 'A'] = true;
if (map[c - 'A' + 26]) {
result = result > c ? result : c;
}
} else {
map[c - 'a' + 26] = true;
if (map[c - 'a']) {
char j = (char) (c - 'A' + 33);
result = result > j ? result : j;
}
}
}
return result < 'A' ? "" : String.valueOf(result);
}
}