java代码实现 给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度
时间: 2023-03-16 16:44:31 浏览: 124
可以使用滑动窗口算法来解决这个问题:从头到尾遍历字符串 s 中的每一个字符,如果当前子串中某个字符出现的次数小于 k ,则将该字符加入当前子串,否则,从当前子串的头部开始去除掉最早出现的那个字符,直到窗口中的每一个字符出现次数都不少于 k 为止,然后继续推进窗口,重复上述过程,直到遍历完字符串 s 中的所有字符。在每一次推进窗口的时候,都会更新一个最大值,即当前最长子串的长度。
相关问题
给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度
我的建议是,先遍历字符串s,找出 k 值以上的所有字符,然后根据k的值建立一个字典,用来记录这些字符出现的次数。接着,从每一个字符开始,遍历 s,若遇到字典中的字符,则把这个字符的出现次数加1,每次加1完成后,检查字典中每个字符的出现次数是否都大于等于 k,若都大于等于 k,则把当前子串的长度记录下来,作为最长子串的候选项,然后继续遍历 s 直到遇到字典中的字符,这时就可以确定最长子串的长度了。
使用kotlin解决这个题目:395. 至少有 K 个重复字符的最长子串 中等 819 相关企业 给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。 示例 1: 输入:s = "aaabb", k = 3 输出:3 解释:最长子串为 "aaa" ,其中 'a' 重复了 3 次。 示例 2: 输入:s = "ababbc", k = 2 输出:5 解释:最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。
可以使用分治算法来解决这个问题。首先统计字符串中每个字符出现的次数,然后遍历字符串,找到第一个出现次数小于 k 的字符,将其作为分割点,将字符串分成左右两部分。递归处理左右两部分,返回两部分中的最大值即可。
Kotlin 代码如下:
```kotlin
fun longestSubstring(s: String, k: Int): Int {
val n = s.length
if (n < k) return 0
val count = IntArray(26)
for (c in s) {
count[c - 'a']++
}
var split = 0
while (split < n && count[s[split] - 'a'] >= k) {
split++
}
if (split == n) return n
val left = longestSubstring(s.substring(0, split), k)
while (split < n && count[s[split] - 'a'] < k) {
split++
}
val right = longestSubstring(s.substring(split), k)
return maxOf(left, right)
}
```
这个算法的时间复杂度为 O(n log n),其中 n 是字符串的长度。
阅读全文