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;
}
};