夯实算法-兼具大小写的最好英文字母

100 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 <= 1000
  • s 由小写和大写英文字母组成

解题思路

由题意分析可通过如下方法处理

将字符按照大小分成两组,并按照字母进行计数。最后从后向前遍历,大小字母表中出现次数均大于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);
}

运行结果

Snipaste_2023-03-04_23-09-50.png

复杂度分析

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)  一起分享知识, Keep Learning!