Skip to content

Commit 7245eeb

Browse files
committed
feat: add solutions to lc problem: No.2309
No.2309.Greatest English Letter in Upper and Lower Case
1 parent 9b275d3 commit 7245eeb

File tree

8 files changed

+267
-86
lines changed

8 files changed

+267
-86
lines changed

solution/2300-2399/2309.Greatest English Letter in Upper and Lower Case/README.md

Lines changed: 112 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,22 @@
5656

5757
**方法一:哈希表 + 枚举**
5858

59+
我们先用哈希表 $ss$ 记录字符串 $s$ 中出现的所有字母,然后从大写字母表的最后一个字母开始枚举,如果当前字母的大写和小写形式都在 $ss$ 中,则返回该字母。
60+
61+
枚举结束后,如果没有找到符合条件的字母,则返回空字符串。
62+
63+
时间复杂度 $O(n)$,空间复杂度 $O(C)$。其中 $n$ 和 $C$ 分别是字符串 $s$ 的长度和字符集的大小。
64+
65+
**方法二:位运算(空间优化)**
66+
67+
我们可以用两个整数 $mask1$ 和 $mask2$ 分别记录字符串 $s$ 中出现的小写字母和大写字母,其中 $mask1$ 的第 $i$ 位表示第 $i$ 个小写字母是否出现,而 $mask2$ 的第 $i$ 位表示第 $i$ 个大写字母是否出现。
68+
69+
然后我们将 $mask1$ 和 $mask2$ 进行与运算,得到的结果 $mask$ 的第 $i$ 位表示第 $i$ 个字母的大小写是否同时出现。
70+
71+
接下来我们只要获取 $mask$ 的二进制表示中最高位的 $1$ 的位置,将其转换为对应的大写字母即可。如果所有二进制位都不为 $1$,说明不存在大小写同时出现的字母,返回空字符串。
72+
73+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 是字符串 $s$ 的长度。
74+
5975
<!-- tabs:start -->
6076

6177
### **Python3**
@@ -72,24 +88,33 @@ class Solution:
7288
return ''
7389
```
7490

91+
```python
92+
class Solution:
93+
def greatestLetter(self, s: str) -> str:
94+
mask1 = mask2 = 0
95+
for c in s:
96+
if c.islower():
97+
mask1 |= 1 << (ord(c) - ord("a"))
98+
else:
99+
mask2 |= 1 << (ord(c) - ord("A"))
100+
mask = mask1 & mask2
101+
return chr(mask.bit_length() - 1 + ord("A")) if mask else ""
102+
```
103+
75104
### **Java**
76105

77106
<!-- 这里可写当前语言的特殊实现逻辑 -->
78107

79108
```java
80109
class Solution {
81110
public String greatestLetter(String s) {
82-
int[] cnt = new int[26];
111+
Set<Character> ss = new HashSet<>();
83112
for (char c : s.toCharArray()) {
84-
if (Character.isLowerCase(c)) {
85-
cnt[c - 'a'] |= 1;
86-
} else if (Character.isUpperCase(c)) {
87-
cnt[c - 'A'] |= 2;
88-
}
113+
ss.add(c);
89114
}
90-
for (int i = 25; i >= 0; --i) {
91-
if (cnt[i] == 3) {
92-
return String.valueOf((char) ('A' + i));
115+
for (char a = 'Z'; a >= 'A'; --a) {
116+
if (ss.contains(a) && ss.contains((char) (a + 32))) {
117+
return String.valueOf(a);
93118
}
94119
}
95120
return "";
@@ -100,16 +125,17 @@ class Solution {
100125
```java
101126
class Solution {
102127
public String greatestLetter(String s) {
103-
Set<Character> ss = new HashSet<>();
104-
for (char c : s.toCharArray()) {
105-
ss.add(c);
106-
}
107-
for (char a = 'Z'; a >= 'A'; --a) {
108-
if (ss.contains(a) && ss.contains((char) (a + 32))) {
109-
return String.valueOf(a);
128+
int mask1 = 0, mask2 = 0;
129+
for (int i = 0; i < s.length(); ++i) {
130+
char c = s.charAt(i);
131+
if (Character.isLowerCase(c)) {
132+
mask1 |= 1 << (c - 'a');
133+
} else {
134+
mask2 |= 1 << (c - 'A');
110135
}
111136
}
112-
return "";
137+
int mask = mask1 & mask2;
138+
return mask > 0 ? String.valueOf((char) (31 - Integer.numberOfLeadingZeros(mask) + 'A')) : "";
113139
}
114140
}
115141
```
@@ -120,16 +146,35 @@ class Solution {
120146
class Solution {
121147
public:
122148
string greatestLetter(string s) {
123-
unordered_set<char> ss;
124-
for (char& c : s) ss.insert(c);
125-
for (char c = 'Z'; c >= 'A'; --c)
126-
if (ss.count(c) && ss.count(char(c + 32)))
149+
unordered_set<char> ss(s.begin(), s.end());
150+
for (char c = 'Z'; c >= 'A'; --c) {
151+
if (ss.count(c) && ss.count(char(c + 32))) {
127152
return string(1, c);
153+
}
154+
}
128155
return "";
129156
}
130157
};
131158
```
132159
160+
```cpp
161+
class Solution {
162+
public:
163+
string greatestLetter(string s) {
164+
int mask1 = 0, mask2 = 0;
165+
for (char& c : s) {
166+
if (islower(c)) {
167+
mask1 |= 1 << (c - 'a');
168+
} else {
169+
mask2 |= 1 << (c - 'A');
170+
}
171+
}
172+
int mask = mask1 & mask2;
173+
return mask ? string(1, 31 - __builtin_clz(mask) + 'A') : "";
174+
}
175+
};
176+
```
177+
133178
### **Go**
134179

135180
```go
@@ -147,16 +192,36 @@ func greatestLetter(s string) string {
147192
}
148193
```
149194

195+
```go
196+
func greatestLetter(s string) string {
197+
mask1, mask2 := 0, 0
198+
for _, c := range s {
199+
if unicode.IsLower(c) {
200+
mask1 |= 1 << (c - 'a')
201+
} else {
202+
mask2 |= 1 << (c - 'A')
203+
}
204+
}
205+
mask := mask1 & mask2
206+
if mask == 0 {
207+
return ""
208+
}
209+
return string(byte(bits.Len(uint(mask))-1) + 'A')
210+
}
211+
```
212+
150213
### **TypeScript**
151214

152215
```ts
153216
function greatestLetter(s: string): string {
154-
let couter = new Array(128).fill(false);
155-
for (let char of s) {
156-
couter[char.charCodeAt(0)] = true;
217+
const ss = new Array(128).fill(false);
218+
for (const c of s) {
219+
ss[c.charCodeAt(0)] = true;
157220
}
158-
for (let i = 90; i >= 65; i--) {
159-
if (couter[i] && couter[i + 32]) return String.fromCharCode(i);
221+
for (let i = 90; i >= 65; --i) {
222+
if (ss[i] && ss[i + 32]) {
223+
return String.fromCharCode(i);
224+
}
160225
}
161226
return '';
162227
}
@@ -185,6 +250,27 @@ impl Solution {
185250
}
186251
```
187252

253+
### **JavaScript**
254+
255+
```js
256+
/**
257+
* @param {string} s
258+
* @return {string}
259+
*/
260+
var greatestLetter = function (s) {
261+
const ss = new Array(128).fill(false);
262+
for (const c of s) {
263+
ss[c.charCodeAt(0)] = true;
264+
}
265+
for (let i = 90; i >= 65; --i) {
266+
if (ss[i] && ss[i + 32]) {
267+
return String.fromCharCode(i);
268+
}
269+
}
270+
return '';
271+
};
272+
```
273+
188274
### **...**
189275

190276
```

solution/2300-2399/2309.Greatest English Letter in Upper and Lower Case/README_EN.md

Lines changed: 96 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,31 @@ class Solution:
6161
return ''
6262
```
6363

64+
```python
65+
class Solution:
66+
def greatestLetter(self, s: str) -> str:
67+
mask1 = mask2 = 0
68+
for c in s:
69+
if c.islower():
70+
mask1 |= 1 << (ord(c) - ord("a"))
71+
else:
72+
mask2 |= 1 << (ord(c) - ord("A"))
73+
mask = mask1 & mask2
74+
return chr(mask.bit_length() - 1 + ord("A")) if mask else ""
75+
```
76+
6477
### **Java**
6578

6679
```java
6780
class Solution {
6881
public String greatestLetter(String s) {
69-
int[] cnt = new int[26];
82+
Set<Character> ss = new HashSet<>();
7083
for (char c : s.toCharArray()) {
71-
if (Character.isLowerCase(c)) {
72-
cnt[c - 'a'] |= 1;
73-
} else if (Character.isUpperCase(c)) {
74-
cnt[c - 'A'] |= 2;
75-
}
84+
ss.add(c);
7685
}
77-
for (int i = 25; i >= 0; --i) {
78-
if (cnt[i] == 3) {
79-
return String.valueOf((char) ('A' + i));
86+
for (char a = 'Z'; a >= 'A'; --a) {
87+
if (ss.contains(a) && ss.contains((char) (a + 32))) {
88+
return String.valueOf(a);
8089
}
8190
}
8291
return "";
@@ -87,16 +96,17 @@ class Solution {
8796
```java
8897
class Solution {
8998
public String greatestLetter(String s) {
90-
Set<Character> ss = new HashSet<>();
91-
for (char c : s.toCharArray()) {
92-
ss.add(c);
93-
}
94-
for (char a = 'Z'; a >= 'A'; --a) {
95-
if (ss.contains(a) && ss.contains((char) (a + 32))) {
96-
return String.valueOf(a);
99+
int mask1 = 0, mask2 = 0;
100+
for (int i = 0; i < s.length(); ++i) {
101+
char c = s.charAt(i);
102+
if (Character.isLowerCase(c)) {
103+
mask1 |= 1 << (c - 'a');
104+
} else {
105+
mask2 |= 1 << (c - 'A');
97106
}
98107
}
99-
return "";
108+
int mask = mask1 & mask2;
109+
return mask > 0 ? String.valueOf((char) (31 - Integer.numberOfLeadingZeros(mask) + 'A')) : "";
100110
}
101111
}
102112
```
@@ -107,16 +117,35 @@ class Solution {
107117
class Solution {
108118
public:
109119
string greatestLetter(string s) {
110-
unordered_set<char> ss;
111-
for (char& c : s) ss.insert(c);
112-
for (char c = 'Z'; c >= 'A'; --c)
113-
if (ss.count(c) && ss.count(char(c + 32)))
120+
unordered_set<char> ss(s.begin(), s.end());
121+
for (char c = 'Z'; c >= 'A'; --c) {
122+
if (ss.count(c) && ss.count(char(c + 32))) {
114123
return string(1, c);
124+
}
125+
}
115126
return "";
116127
}
117128
};
118129
```
119130
131+
```cpp
132+
class Solution {
133+
public:
134+
string greatestLetter(string s) {
135+
int mask1 = 0, mask2 = 0;
136+
for (char& c : s) {
137+
if (islower(c)) {
138+
mask1 |= 1 << (c - 'a');
139+
} else {
140+
mask2 |= 1 << (c - 'A');
141+
}
142+
}
143+
int mask = mask1 & mask2;
144+
return mask ? string(1, 31 - __builtin_clz(mask) + 'A') : "";
145+
}
146+
};
147+
```
148+
120149
### **Go**
121150

122151
```go
@@ -134,16 +163,36 @@ func greatestLetter(s string) string {
134163
}
135164
```
136165

166+
```go
167+
func greatestLetter(s string) string {
168+
mask1, mask2 := 0, 0
169+
for _, c := range s {
170+
if unicode.IsLower(c) {
171+
mask1 |= 1 << (c - 'a')
172+
} else {
173+
mask2 |= 1 << (c - 'A')
174+
}
175+
}
176+
mask := mask1 & mask2
177+
if mask == 0 {
178+
return ""
179+
}
180+
return string(byte(bits.Len(uint(mask))-1) + 'A')
181+
}
182+
```
183+
137184
### **TypeScript**
138185

139186
```ts
140187
function greatestLetter(s: string): string {
141-
let couter = new Array(128).fill(false);
142-
for (let char of s) {
143-
couter[char.charCodeAt(0)] = true;
188+
const ss = new Array(128).fill(false);
189+
for (const c of s) {
190+
ss[c.charCodeAt(0)] = true;
144191
}
145-
for (let i = 90; i >= 65; i--) {
146-
if (couter[i] && couter[i + 32]) return String.fromCharCode(i);
192+
for (let i = 90; i >= 65; --i) {
193+
if (ss[i] && ss[i + 32]) {
194+
return String.fromCharCode(i);
195+
}
147196
}
148197
return '';
149198
}
@@ -172,6 +221,27 @@ impl Solution {
172221
}
173222
```
174223

224+
### **JavaScript**
225+
226+
```js
227+
/**
228+
* @param {string} s
229+
* @return {string}
230+
*/
231+
var greatestLetter = function (s) {
232+
const ss = new Array(128).fill(false);
233+
for (const c of s) {
234+
ss[c.charCodeAt(0)] = true;
235+
}
236+
for (let i = 90; i >= 65; --i) {
237+
if (ss[i] && ss[i + 32]) {
238+
return String.fromCharCode(i);
239+
}
240+
}
241+
return '';
242+
};
243+
```
244+
175245
### **...**
176246

177247
```

0 commit comments

Comments
 (0)