2309. 兼具大小写的最好英文字母

175 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情

题目 leetcode.cn/

  • 给你一个由英文字母组成的字符串 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<=10001 <= s.length <= 1000
  • s由小写和大写英文字母组成s 由小写和大写英文字母组成

代码

function greatestLetter(s: string): string {
    let max = 0;
    for(let i = 0; i < s.length; i++){
        if(s.charCodeAt(i) >= 97){
            let index = s.charCodeAt(i) - 32;
            if(s.includes(String.fromCharCode(index))){
                max = Math.max(max, index);
            }
        } else {
            let index = s.charCodeAt(i) + 32;
            if(s.includes(String.fromCharCode(index))){
                max = Math.max(max, s.charCodeAt(i));
            }
        }
    }
    return max ? String.fromCharCode(max) : '';
};
  • ASCII + 遍历统计:

    • 核心就是大小写字母他们的ASCII码不一样,aASCII97AASCII65,每个大写字母和它的小写字母相差32

    • 遍历整个字符串,依次使用charCodeAt求出当前字符的ASCII,判断当前字符是大写字母还是小写字母

      • 如果是小写字母,那么它对应的大写字母的ASCII需要减去32,再使用fromCharCode转化成对应的大写字母,判断其在不在原字符串中,如果在,那么与开始定义的变量比较ASCII的大小,因为最后返回的是大写字母的靠后的哪一个
      • 如果是大写字母,那么它对应的大写字母的ASCII需要加上32,再使用fromCharCode转化成对应的大写字母,判断其在不在原字符串中,如果在,那么与开始定义的变量比较ASCII的大小
    • 最后判断max是否为0,因为如果没有最好英文字母的话,max就是初始值

      • 如果是0,则返回空字符串
      • 否则返回fromCharCode后的字母

结果

  • ASCII + 遍历统计:

image.png