2981. Find Longest Special Substring That Occurs Thrice I

2981. Find Longest Special Substring That Occurs Thrice I

Description

You are given a string s that consists of lowercase English letters.

A string is called special if it is made up of only a single character. For example, the string "abc" is not special, whereas the strings "ddd", "zz", and "f" are special.

Return the length of the longest special substring of s which occurs at least thrice , or -1 if no special substring occurs at least thrice.

A substring is a contiguous non-empty sequence of characters within a string.

Example 1:

1
2
3
4
Input: s = "aaaa"
Output: 2
Explanation: The longest special substring which occurs thrice is "aa": substrings "**aa** aa", "a**aa** a", and "aa**aa** ".
It can be shown that the maximum length achievable is 2.

Example 2:

1
2
3
Input: s = "abcdef"
Output: -1
Explanation: There exists no special substring which occurs at least thrice. Hence return -1.

Example 3:

1
2
3
4
Input: s = "abcaba"
Output: 1
Explanation: The longest special substring which occurs thrice is "a": substrings "**a** bcaba", "abc**a** ba", and "abcab**a** ".
It can be shown that the maximum length achievable is 1.

Constraints:

  • 3 <= s.length <= 50
  • s consists of only lowercase English letters.

Hints/Notes

Solution

Language: C++

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
class Solution {
public:
int maximumLength(string s) {
unordered_map<string, int> m;
int n = s.size(), res = -1;
for (int i = 0; i < n; ) {
int start = i;
while (s[i] == s[start]) {
i++;
}
int len = i - start;
string cur = s.substr(start, len);
m[cur]++;
if (m[cur] >= 3) res = max(res, (int)cur.size());
cur.pop_back();
if (!cur.empty()) {
m[cur] += 2;
if (m[cur] >= 3) {
res = max(res, (int)cur.size());
}
cur.pop_back();
if (!cur.empty()) {
res = max(res, (int)cur.size());
}
}
}
return res;
}
};