-
Notifications
You must be signed in to change notification settings - Fork 4.9k
/
LongestNiceSubstring.cpp
79 lines (74 loc) · 2.53 KB
/
LongestNiceSubstring.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Source : https://leetcode.com/problems/longest-nice-substring/
// Author : Hao Chen
// Date : 2021-03-08
/*****************************************************************************************************
*
* A string s is nice if, for every letter of the alphabet that s contains, it appears both in
* uppercase and lowercase. For example, "abABB" is nice because 'A' and 'a' appear, and 'B' and 'b'
* appear. However, "abA" is not because 'b' appears, but 'B' does not.
*
* Given a string s, return the longest substring of s that is nice. If there are multiple, return the
* substring of the earliest occurrence. If there are none, return an empty string.
*
* Example 1:
*
* Input: s = "YazaAay"
* Output: "aAa"
* Explanation: "aAa" is a nice string because 'A/a' is the only letter of the alphabet in s, and both
* 'A' and 'a' appear.
* "aAa" is the longest nice substring.
*
* Example 2:
*
* Input: s = "Bb"
* Output: "Bb"
* Explanation: "Bb" is a nice string because both 'B' and 'b' appear. The whole string is a substring.
*
* Example 3:
*
* Input: s = "c"
* Output: ""
* Explanation: There are no nice substrings.
*
* Example 4:
*
* Input: s = "dDzeE"
* Output: "dD"
* Explanation: Both "dD" and "eE" are the longest nice substrings.
* As there are multiple longest nice substrings, return "dD" since it occurs earlier.
*
* Constraints:
*
* 1 <= s.length <= 100
* s consists of uppercase and lowercase English letters.
******************************************************************************************************/
class Solution {
inline int getCharIndex(char c) {
return (c >='A' && c <='Z') ? c - 'A' : c - 'a';
}
inline int getCaseIndex(char c) {
return (c >='A' && c <='Z') ? 1 : 0;
}
public:
string longestNiceSubstring(string s) {
vector<bitset<26>> check(2);
int start = 0, len = 0;
for (int i = 0; i < s.size() -1; i++){
for (int j = i+1; j < s.size(); j++) {
check[0] = check[1] = 0;
for (int x=i; x<=j; x++){
int i = getCaseIndex(s[x]);
int j = getCharIndex(s[x]);
check[i][j] = true;
}
if ( (check[0] ^ check[1]) == 0 ) {
if ( j - i + 1 > len ){
start = i;
len = j-i+1;
}
}
}
}
return s.substr(start, len);
}
};