Leetcode算法题395. Longest Substring with At Least K Repeating Characters

这篇博客介绍了LeetCode算法题395,目标是找到字符串中具有至少K个重复字符的最长子串。博主探讨了使用分治算法来解决此问题的方法。
摘要由CSDN通过智能技术生成

原题链接

  • 分治算法
class Solution {
    // 分治算法
    public int longestSubstring(String s, int k) {
        // 如果string的长度小于k,那么必不包含重复出现k次及以上的字母
        if(s.length() < k) return 0;

        // 记录每个字母出现的次数
        HashMap<Character, Integer> charCount = new HashMap<>();

        for(int i = 0; i < s.length(); i++){
            charCount.put(s.charAt(i), charCount.getOrDefault(s.charAt(i), 0) + 1);
        }

        for (Character c : charCount.keySet()) {
            // 如果字符串中有字母的出现次数小于k,
            // 那么符合条件的substring必不包含该字母,
            // 所以就在不包含该字母的substring继续找符合条件的substring,
            // 返回它们的长度
            if(charCount.get(c) < k){
                int res = 0;    //符合条件的字符串的长度

                for (String s1 : s.split(String.valueOf(c))) {
                    res = Math.max(res, longestSubstring(s1, k));
                }

                return res;
            }
        }

        // 一个完整的string或者substring符合条件,
        // 它就不会进入if(charCount.get(c) < k)语句,
        // 所以可以直接返回它的长度
        return s.length();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值