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

标签: 哈希表 字符串 枚举

难度: Easy

给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母,则返回一个空字符串。

最好 英文字母的大写和小写形式必须 s 中出现。

英文字母 b 比另一个英文字母 a 更好 的前提是:英文字母表中,ba 出现。

示例 1:

输入:s = "lEeTcOdE"
输出:"E"
解释:
字母 'E' 是唯一一个大写和小写形式都出现的字母。

示例 2:

输入:s = "arRAzFif"
输出:"R"
解释:
字母 'R' 是大写和小写形式都出现的最好英文字母。
注意 'A' 和 'F' 的大写和小写形式也都出现了,但是 'R' 比 'F' 和 'A' 更好。

示例 3:

输入:s = "AbCdEfGhIjK"
输出:""
解释:
不存在大写和小写形式都出现的字母。

提示:

  • 1 <= s.length <= 1000
  • s 由小写和大写英文字母组成

Submission

运行时间: 26 ms

内存: 16.1 MB

class Solution:
    def greatestLetter(self, s: str) -> str:
        lowalp_list = [chr(i) for i in range(97, 123)]
        upalp_list = [chr(i) for i in range(65, 91)]
        lst = []
        for i in range(26):
            if lowalp_list[i] in s and upalp_list[i] in s:
                lst.append(upalp_list[i])
        if len(lst) == 0:
            return ""
        
        return lst[-1]

Explain

此题解首先生成两个列表,一个包含所有小写英文字母(lowalp_list),另一个包含所有大写英文字母(upalp_list)。对于每个字母,代码检查其大写和小写形式是否都在输入字符串s中出现。如果都出现,则将该字母的大写形式添加到列表lst中。遍历完成后,如果lst非空,返回lst中的最后一个元素,即字母表中最后一个同时具有大小写形式出现在s中的字母。如果lst为空,返回空字符串。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def greatestLetter(self, s: str) -> str:
        # 创建小写字母列表
        lowalp_list = [chr(i) for i in range(97, 123)]
        # 创建大写字母列表
        upalp_list = [chr(i) for i in range(65, 91)]
        # 用于存储同时包含大写和小写的字母
        lst = []
        # 遍历26个字母
        for i in range(26):
            # 检查当前字母的大小写形式是否都存在于s中
            if lowalp_list[i] in s and upalp_list[i] in s:
                # 如果存在,添加大写形式到lst
                lst.append(upalp_list[i])
        # 如果没有找到任何符合条件的字母,返回空字符串
        if len(lst) == 0:
            return ""
        # 返回字母表中最后一个符合条件的大写字母
        return lst[-1]

Explore

使用两个列表分别存储小写和大写字母的主要原因是为了代码的可读性和简便性。通过预先定义好的小写字母和大写字母列表,可以直接通过索引来访问对应的字母,无需在每次循环中进行ASCII值的计算和转换,这样可以使代码更加清晰易懂。虽然直接使用ASCII值进行转换也是可行的,但这通常会使代码复杂度稍增,特别是对于不熟悉ASCII编码的人来说,直接看到字符列表比计算ASCII值更直观。

是的,这样的时间复杂度确实可以优化。在当前的实现中,对于每一个字母,代码都会在字符串s中进行一次搜索,这使得时间复杂度达到O(26*n),其中n是字符串s的长度。一个更高效的方法是首先使用一个集合来存储字符串s中出现的所有字符,这个操作的时间复杂度是O(n)。然后,只需要检查每个字母的大小写是否都在这个集合中,这个检查的时间复杂度是O(1),因此总的时间复杂度将降低到O(n)。

确实存在更高效的方法来直接找到最后一个符合条件的字母。由于题目中指出需要返回字母表中最后一个符合条件的字母,我们可以从字母表的末尾开始向前检查每个字母。这样,一旦我们找到第一个即字母表中最后一个符合条件的大小写字母,我们可以立即停止搜索。这避免了使用额外的列表来存储所有符合条件的字母,从而节省了空间并可能减少一些运行时间,因为一旦找到符合条件的字母就可以停止循环。