leetcode 395. Longest Substring with At Least K Repeating Characters

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

猜你喜欢

转载自www.cnblogs.com/ymjyqsx/p/10908461.html