刷题的日常-兼具大小写的最好英文字母

100 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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);
    }
}