395. Longest Substring with At Least K Repeating Characters
https://www.cnblogs.com/grandyang/p/5852352.html
题目的要求是找一段字符串,这段字符串中每个单词出现的次数都必须至少超过k次,求满足这种条件的字符串的最长的长度。
暴力的方法是两个for循环,然后用hash记录字符出现的次数,然后每次去判断hash中是否满足这种条件,但每次去判断hash就比较复杂。
下面这种方法,用一个int型32位的数字来标记当前遍历的字符是否满足条件,26以下每一位为0表示这个字符满足条件,为1表示不满足。每次更新,通过左移1来更新flag。如果flag为0了,说明当前位置所有的字符都满足条件,然后更新最大值,并且更新new_index。这个new_index+1就是下一次外循环的起点。
class Solution { public: int longestSubstring(string s, int k) { int n = s.size(),i = 0,res = 0; while(i + k <= n){ int m[26] = {0},flag = 0,new_index = i; for(int j = i;j < n;j++){ m[s[j] - 'a']++; if(m[s[j] - 'a'] < k) flag |= 1 << s[j] - 'a'; else flag &= ~(1 << s[j] - 'a'); if(flag == 0){ res = max(res,j - i + 1); new_index = j; } } i = new_index + 1; } return res; } };