LC每日一题|20240530 - 2982. 找出出现至少三次的最长特殊子字符串 II

52 阅读1分钟

LC每日一题|20240530 - 2982. 找出出现至少三次的最长特殊子字符串 II

给你一个仅由小写英文字母组成的字符串 s

如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串 "abc" 不是特殊字符串,而字符串 "ddd""zz""f" 是特殊字符串。

返回在 s 中出现 至少三次最长特殊子字符串 的长度,如果不存在出现至少三次的特殊子字符串,则返回 -1

子字符串 是字符串中的一个连续 非空 字符序列。

提示:

  • 3 <= s.length <= 5 * 10^5
  • s 仅由小写英文字母组成。

题目等级: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
    }
}