【LeetCode】兼具大小写的最好英文字母Java题解

173 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

题目描述

给你一个由英文字母组成的字符串 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"
输出:""
解释:
不存在大写和小写形式都出现的字母。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/greatest-english-letter-in-upper-and-lower-case
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是字符串处理题目,题目比较长,分析之后,核心如下。1. 返回字符为大写字符或者空字符串。 2. 最好 英文字母的大写和小写形式必须 都 在 s 中出现。3. 字母按照自然序列排序,需要返回自然序大的字母。
  • 根据上述分析,首先我们使用 hashset 记录每一个出现的字符。然后可以使用 ASCII 的知识,对出现的字符进行处理。什么是 ASCII?ASCII 码是一套编码规范。ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。
  • 其中 ASCII 32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。 65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
  • 根据 ASCII 码知识,字符大小写的 ASCII 码的差值是32。我们从 90 开始便利,找打符合题目要求的字符。实现代码如下,供参考。

通过代码

class Solution {
    public String greatestLetter(String s) {
        Set<Character> set = new HashSet<>();
        for (char ch : s.toCharArray()) {
            set.add(ch);
        }
        StringBuilder ans = new StringBuilder();
        for (int i = 90; i >= 65; i--) {
            if (set.contains((char) i) && set.contains((char) (i + 32))){
                ans.append((char) i);
                break;
            } 
        }
        
        return ans.toString();
        
    }

总结

  • 上述算法的时间复杂度是O(n),空间复杂度是O(n)
  • 坚持算法每日一题,加油!