LC每日一题|20240530 - 2982. 找出出现至少三次的最长特殊子字符串 II
给你一个仅由小写英文字母组成的字符串
s。如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串
"abc"不是特殊字符串,而字符串"ddd"、"zz"和"f"是特殊字符串。返回在
s中出现 至少三次 的 最长特殊子字符串 的长度,如果不存在出现至少三次的特殊子字符串,则返回-1。子字符串 是字符串中的一个连续 非空 字符序列。
提示:
3 <= s.length <= 5 * 10^5s仅由小写英文字母组成。
题目等级:Medium
解题思路
此题是昨天每日一题的进阶,只是数据量不同,使用昨天的代码可以直接AC~
思路见LC每日一题|20240529 - 2981. 找出出现至少三次的最长特殊子字符串 I
AC代码
class Solution {
fun maximumLength(s: String): Int {
val map = HashMap<Char, ArrayList<Int>>()
var start = 0
for (i in s.indices) {
if (s[i] != s[start]) {
map[s[start]] = (map[s[start]] ?: arrayListOf()).apply { add(i - start) }
start = i
}
}
map[s[start]] = (map[s[start]] ?: arrayListOf()).apply { add(s.length - start) }
var max = -1
for (m in map) {
val len = m.value.sorted()
val a = if (len.size == 1) {
if (len[0] > 2) len[0] - 2 else -1
} else if (len.size == 2 || len[len.size - 1] != len[len.size - 2]) {
if (len[len.size - 1] < 2) -1 else Math.max(len[len.size - 1] - 2, Math.min(len[len.size - 1] - 1, len[len.size - 2]))
} else {
Math.max(len[len.size - 3], len[len.size - 1] - 1)
}
max = Math.max(max, a)
}
return max
}
}