2309. 兼具大小写的最好英文字母
LeetCode: 2309. 兼具大小写的最好英文字母
简单 \color{#00AF9B}{简单} 简单
给你一个由英文字母组成的字符串
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
由小写和大写英文字母组成
方法1:哈希表
建立哈希表,以每个字符为单位,记录每个字符的大小写的出现情况。对于某字符的大小写是否出现,只需要 2位 来记录即可。例如 最低位 的1或0代表 小写字符 是否出现,高一位 的1或0代表大小字符是否出现。
遍历完字符串 s
后,哈希表也就构建完成了。随后按照题目对于字符在字符集中越 后 越好的规则,对哈希表进行倒序遍历。找到一个哈希表值为 0b11
的项即为答案。
#include <string>
#include <cctype>
using namespace std;
class Solution
{
public:
string greatestLetter(const string &s)
{
constexpr int SIZE = 26;
char hashtable[SIZE]{};
for (const char &c : s)
{
if (std::islower(c))
hashtable[c - 'a'] |= (char)0b01;
else
hashtable[c - 'A'] |= (char)0b10;
}
for (int i = SIZE - 1; i >= 0; --i)
{
if (hashtable[i] == (char)0b11)
return string{(char)(i + 'A')};
}
return "";
}
};
复杂度分析:
-
时间复杂度: O ( n + ∣ Σ ∣ ) O(n + |Σ|) O(n+∣Σ∣)。其中, n n n 为字符串
s
的长度, ∣ Σ ∣ |Σ| ∣Σ∣ 为字符集的大小。 -
空间复杂度: O ( 1 ) O(1) O(1)。没有用到额外的、大小与输入数据有关的变量,因此仅占用常数的额外空间。
参考结果
Accepted
113/113 cases passed (0 ms)
Your runtime beats 100.00 % of cpp submissions
Your memory usage beats 90.84 % of cpp submissions (6.4 MB)