leetcode 395 至少有K个重复字符的最长子串

找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 的长度。

示例 1:

输入:
s = "aaabb", k = 3

输出:
3

最长子串为 "aaa" ,其中 ‘a‘ 重复了 3 次。

示例 2:

输入:
s = "ababbc", k = 2

输出:
5

最长子串为 "ababb" ,其中 ‘a‘ 重复了 2 次, ‘b‘ 重复了 3 次。

思路1: 暴力枚举
class Solution {
  public int longestSubstring(String s, int k) {
        if(s.length() <= 0){
            return 0;
        }
        int size = 0;
        char[] array = s.toCharArray();
        for(int i=0; i<array.length;i++){
            int[] count = new int[26];
            count[array[i] - ‘a‘] ++;
            for(int j=i; j< array.length;j++){
                if(i!=j) {
                    count[array[j] - ‘a‘]++;
                }
                if( Judge(count, k ) && (j-i+1)>size){
                    size = j-i+1;
                }
            }
        }
        return size;
    }
    boolean Judge(int[] count ,int k ){
        for(int i=0; i<count.length;i++){
            if( count[i] > 0 && count[i] <k ){
                return false;
            }
        }
        return  true;
    }
}

思路2: 

如果一个字符串中有一个字符出现的次数少于k,那么这个字符必定不在结果中。所以利用这个出现次数少于k的字符来切分字符数组,对于左边和右边进行递归操作
    public int longestSubstring(String s, int k) {
        return longestSubstringSub(s, k, 0, s.length() - 1);
    }
    private int longestSubstringSub(String s, int k, int start, int end) {
        if(end<=start){
            return 0;
        }
        int[] count =new int[26];
        for(int i=start; i<=end; i++){
            count[s.charAt(i) -‘a‘]++;
        }
//        for(int i=start; i<=end;i++){
//            if(count[s.charAt(i) - ‘a‘] > 0 && count[s.charAt(i) - ‘a‘] <k){
//                return  Math.max( longestSubstringSub(s, k,start,i-1), longestSubstringSub(s,k,i+1, end));
//            }
//        }
        int res = end - start + 1;
//        return res;
        for(int i = 0; i < 26; i++){
            if(count[i] > 0 && count[i] < k){
                int pos = s.indexOf((char)(i + ‘a‘), start);
                res = Math.max(longestSubstringSub(s, k, start, pos - 1), longestSubstringSub(s, k, pos + 1, end));
            }
        }
        return res;
    }


原文地址:https://www.cnblogs.com/xianbin7/p/10748976.html

时间: 2024-11-03 05:23:20

leetcode 395 至少有K个重复字符的最长子串的相关文章

395 Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子串

找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k .输出 T 的长度.示例 1:输入:s = "aaabb", k = 3输出:3最长子串为 "aaa" ,其中 'a' 重复了 3 次.示例 2:输入:s = "ababbc", k = 2输出:5最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次. 详见:https://leetcode.com

【leetcode】 算法题3 无重复字符的最长子串

问题 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. 给定 "bbbbb" ,最长的子串就是 "b" ,长度是1. 给定 "pwwkew" ,最长子串是 "wke" ,长度是3.请注意答案必须是一个子串,"pwke" 是 子序列  而不是子串 代码实现 class S

#leetcode刷题之路3-无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 字符数组和字符串的区别,C语言字符数组和字符串区别详解 开始的想法是在对字符数组设置两个指针,初始化一个在位置0一个在位置1,ans初始化为1(非空),然后1向后找,0不动,取0到1之间的字符串,判断是否重复(这里单独写一个函数,输入字符串,输出是否重复以及重复字符的后一个的位置),不

leetcode的Hot100系列--3. 无重复字符的最长子串--滑动窗口

可以先想下这两个问题: 1.怎样使用滑动窗口? 2.如何快速的解决字符查重问题? 滑动窗口 可以想象一下有两个指针,一个叫begin,一个叫now 这两个指针就指定了当前正在比较无重复的字符串,当再往后读取一个字符的时候,就需要比较该字符在begin到now之间是否有重复,如果有重复的话,则记录当前字符串长度,然后把begin往后移动,继续寻找后面的无重复字符子串. 例如,这里的字符串是:"fabcade". 1.当开始比较字符串的时候,begin指向了第一个字符f,now也指向了第一

leetcode第三题:无重复字符的最长子串

public static int lengthOfLongestSubstring(String s) { int len = s.length(); int res = 0; int start = 0; int end = 0; HashSet set = new HashSet(); while (start < s.length() && end < s.length()) { if (set.contains(s.charAt(end))) { set.remove

Leetcode(3)无重复字符的最长子串

Leetcode(3)无重复字符的最长子串 [题目表述]: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 第一种方法:暴力 执行用时:996 ms: 内存消耗:12.9MB 效果:太差 class Solution(object): def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ Maxsize=0 res='' if len(s)

【LeetCode】无重复字符的最长子串

给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. 给定 "bbbbb" ,最长的子串就是 "b" ,长度是1. 给定 "pwwkew" ,最长子串是 "wke" ,长度是3.请注意答案必须是一个子串,"pwke" 是 子序列  而不是子串. 解题思路: 1. 给两个数组

【Leetcode】【Longest Substring Without Repeating Characters】【无重复字符的最长子串】【C++】

题目:给定一字符串,求其无重复字符的最长子串长度. 思路:for循环一次,时间复杂度为O(N).字符的ascii值为32~126.start表示当前无重复字符子串的初始位置,初始值为0:可定义一个位置数组pos[128]表示for循环索引到当前位置时相应的字符对应的位置.若当前字符s[i](其ascii值为cur_pos),若pos[cur_pos]>=start,说明在start之后已有该字符s[i],则以start开始的子串第一次遇到重复字符,打住.判断当前长度是否大于max_len,若大于

[LeetCode]无重复字符的最长子串

给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 无重复字符的最长子串是 "b",其长度为 1. 示例 3: 输入: "pwwkew" 输出: 3 解释: 无重复字符的最长子串是 "wke",其长度为 3.   请注