美文网首页
Longest Substring with At Least

Longest Substring with At Least

作者: 我叫胆小我喜欢小心 | 来源:发表于2017-05-12 16:44 被阅读175次

题目来源
给一个字符串,以及一个数字k,求该字符串子串中每个字符出现的频次都大于等于k。
还是没有想法。
看了下讨论区,就是先遍历一遍,得出各个字符的频次,然后再遍历,找到第一个不符合的。然后分割成前后两块,再进行同样的操作。
能过,不过时间复杂度还是比价高的,平均复杂度应该是O(nlogn)。
代码如下:

class Solution {
public:
    int longestSubstring(string s, int k) {
        int len = s.size();
        int maps[26] = {0};
        for (int i=0; i<len; i++)
            maps[s[i]-'a']++;
        int splitPos = 0;
        while (splitPos < len && maps[s[splitPos] - 'a'] >= k)
            splitPos++;
        if (splitPos == len)
            return len;
        int left = longestSubstring(s.substr(0, splitPos), k);
        int right = longestSubstring(s.substr(splitPos + 1), k);
        return max(left, right);
    }
};

这个复杂度是O(n),具体的话因为应该是O(26*n)。因为最多递归26次,每次至少去除了一个字母。每层递归的复杂度应该是O(n)。

class Solution {
public:
    int longestSubstring(string s, int k) {
        return longestSubstring_recur(s, k, 0, s.size());
    }
    
    int longestSubstring_recur(const string& s, int k, int start, int end)
    {
        int count[26] = {0};
        for (int i=start; i<end; i++)
            count[s[i] - 'a']++;
            
        int maxLen = 0;
        for (int i=start; i<end; ) {
            while (i < end && count[s[i] - 'a'] < k)
                i++;
            if (i == end)
                break;
            int moreThanK = i;
            while (moreThanK < end && count[s[moreThanK] - 'a'] >= k)
                moreThanK++;
            if (i == start && moreThanK == end)
                return end - start;
            maxLen = max(maxLen, longestSubstring_recur(s, k, i, moreThanK));
            i = moreThanK;
        }
        return maxLen;
    }
};

相关文章

网友评论

      本文标题:Longest Substring with At Least

      本文链接:https://www.haomeiwen.com/subject/qezztxtx.html