2309. Greatest English Letter in Upper and Lower Case
Description
Given a string of English letters s, return the greatest English letter which occurs as both a lowercase and uppercase letter in s. The returned letter should be in uppercase. If no such letter exists, return an empty string.
An English letter b is greater than another letter a if b appears after a in the English alphabet.
Example 1:
Input: s = "lEeTcOdE" Output: "E" Explanation: The letter 'E' is the only letter to appear in both lower and upper case.
Example 2:
Input: s = "arRAzFif" Output: "R" Explanation: The letter 'R' is the greatest letter to appear in both lower and upper case. Note that 'A' and 'F' also appear in both lower and upper case, but 'R' is greater than 'F' or 'A'.
Example 3:
Input: s = "AbCdEfGhIjK" Output: "" Explanation: There is no letter that appears in both lower and upper case.
Constraints:
1 <= s.length <= 1000sconsists of lowercase and uppercase English letters.
Solutions
Solution 1: Hash Table + Enumeration
Thinking
\(s\) has length at most \(1000\); we need the greatest letter that appears in both cases. Put every character in a set, then scan \(Z\) down to \(A\). The first hit is the answer.
The set answers each case check in expected constant time. If none succeed, return the empty string.
First, we use a hash table \(ss\) to record all the letters that appear in the string \(s\). Then we start enumerating from the last letter of the uppercase alphabet. If both the uppercase and lowercase forms of the current letter are in \(ss\), we return that letter.
At the end of the enumeration, if no letter that meets the conditions is found, we return an empty string.
The time complexity is \(O(n)\), and the space complexity is \(O(C)\). Here, \(n\) and \(C\) are the length of the string \(s\) and the size of the character set, respectively.
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Solution 2: Bit Manipulation (Space Optimization)
Thinking
Method 1 uses space linear in the alphabet. Twenty-six letters fit in two integer masks; their intersection’s highest set bit is the greatest letter, so extra space becomes \(O(1)\).
We can use two integers \(mask1\) and \(mask2\) to record the lowercase and uppercase letters that appear in the string \(s\), respectively. The \(i\)-th bit of \(mask1\) indicates whether the \(i\)-th lowercase letter appears, and the \(i\)-th bit of \(mask2\) indicates whether the \(i\)-th uppercase letter appears.
Then we perform a bitwise AND operation on \(mask1\) and \(mask2\). The \(i\)-th bit of the resulting \(mask\) indicates whether the \(i\)-th letter appears in both uppercase and lowercase.
Next, we just need to get the position of the highest \(1\) in the binary representation of \(mask\), and convert it to the corresponding uppercase letter. If all binary bits are not \(1\), it means that there is no letter that appears in both uppercase and lowercase, so we return an empty string.
The time complexity is \(O(n)\), where \(n\) is the length of the string \(s\). The space complexity is \(O(1)\).
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |