Medium
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:
Input: s = “aaaa”
Output: 2
Explanation: The longest special substring which occurs thrice is “aa”: substrings “aaaa”, “aaaa”, and “aaaa”.
It can be shown that the maximum length achievable is 2.
Example 2:
Input: s = “abcdef”
Output: -1
Explanation: There exists no special substring which occurs at least thrice. Hence return -1.
Example 3:
Input: s = “abcaba”
Output: 1
Explanation: The longest special substring which occurs thrice is “a”: substrings “abcaba”, “abcaba”, and “abcaba”.
It can be shown that the maximum length achievable is 1.
Constraints:
3 <= s.length <= 5 * 105
s
consists of only lowercase English letters.public class Solution {
public int maximumLength(String s) {
int[][] arr = new int[26][4];
char prev = s.charAt(0);
int count = 1;
int max = 0;
for (int index = 1; index < s.length(); index++) {
if (s.charAt(index) != prev) {
int[] ints = arr[prev - 'a'];
updateArr(count, ints);
prev = s.charAt(index);
count = 1;
} else {
count++;
}
}
updateArr(count, arr[prev - 'a']);
for (int[] values : arr) {
if (values[0] != 0) {
if (values[1] >= 3) {
max = Math.max(max, values[0]);
} else if (values[1] == 2 || values[2] == values[0] - 1) {
max = Math.max(max, values[0] - 1);
} else {
max = Math.max(max, values[0] - 2);
}
}
}
return max == 0 ? -1 : max;
}
private void updateArr(int count, int[] ints) {
if (ints[0] == count) {
ints[1]++;
} else if (ints[0] < count) {
ints[3] = ints[1];
ints[2] = ints[0];
ints[0] = count;
ints[1] = 1;
} else if (ints[2] < count) {
ints[2] = count;
ints[3] = 1;
}
}
}