395. Longest Substring with At Least K Repeating Characters

395 . Longest Substring with At Least K Repeating Characters

Difficulty: Medium

Find the length of the longest substring T of a given string (consists
of lowercase letters only) such that every character in T appears no
less than k times.

Example 1:

Input: s = “aaabb”, k = 3

Output: 3

The longest substring is “aaa”, as ‘a’ is repeated 3 times. Example 2:

Input: s = “ababbc”, k = 2

Output: 5

The longest substring is “ababb”, as ‘a’ is repeated 2 times and ‘b’
is repeated 3 times.

解题思路

这道题是关于最长子串的寻找问题,限制条件是,子串中的所有出现过的字符,数量不得少于给定的值k。

此时不难想象问题的重点在于遍历字符串的时候快速确认当前字符是否已经满足要求,即出现k次。而我想对于每一个字符位置都进行一次遍历就能找齐所有满足要求的子串了,被这个子串覆盖的字符可以直接跳过。

然而我真的一下子想不到一个很高效的方法来达到目的,也即是快速的判断子串中的字符是否都已经满足条件。最后在网上面大神的题解下了解到了mask这一种方法,利用整形结构的mask刚刚好能解决这个问题,因为其实就只有26个字母要考虑,而mask有32位,所以很好的解决了问题。

具体实现

class Solution {
public:
    int longestSubstring(string s, int k) {
        int ans = 0;
        int i = 0;
        int n = s.size();
        while(i+k<n)
        {
            int m[26] = {0};int mask = 0; int max_id = i;
            for(int j = i;j < n;j++)
            {
                int temp = s[j] - 'a';
                m[temp]++;
                if(m[temp] < k) mask |= 1 << temp;
                else mask &= ~(1 << temp);
                if(mask == 0)
                {
                    ans = max(ans,j-i+1);
                    max_id = j;
                }
            }
            i = max_id+1;
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值