int longestSubstring(string s, int k) 
 {
     if (s=="") return 0;
     
     unordered_map<char,int>Map;
     for (int i=0; i<s.size(); i++)
         Map[s[i]]++;
             
     unordered_set<char>Set;
     for (auto a:Map)
     {
         if (a.second>=k)
             Set.insert(a.first);            
     }        
     if (Set.size()==Map.size())
         return s.size();
     
     int result=0;
     for (int i=0; i<s.size(); i++)
     {
         int i0=i;
         while (i<s.size() && Set.find(s[i])!=Set.end())
             i++;
         result = max(result, longestSubstring(s.substr(i0,i-i0),k));
     }
     
     return result;
         
 }
Example #2
0
    int longestSubstring(string s, int k) {
        if (k <= 1) return s.size();

        unordered_map<char, int> myMap;

        for (char c : s) myMap[c]++;

        int n = s.size(), ret = 0, cur = 0, i = 0;

        for (i = 0; i < n; i++) {
            if (myMap[s[i]] < k) break;
        }

        if (i == n) return s.size();

        ret = max(longestSubstring(s.substr(0, i), k), longestSubstring(s.substr(i + 1), k));

        return ret;
    }
Example #3
0
 int longestSubstring(string s, int k) {
     if (s.size() < k) 
         return 0;
     
     int result = s.size();
     vector<int> chars(26, 0);
     for (int i = 0; i < s.size(); i++) {
         chars[s[i] - 'a']++;
     }
     
     int i;
     for (i = 0; i < s.size(); i++) {
         if (chars[s[i] - 'a'] < k) {
             break;
         }
     }
     
     if (i == s.size()) return s.size();
     
     return max(longestSubstring(s.substr(0, i), k), longestSubstring(s.substr(i + 1), k));
 }
 int longestSubstring(string s, int k) 
 {
     if(s.size() < k) return 0;
     
     int c[200] = {0};
     
     for(char i : s) ++c[i];
     
     int len = s.size();
     
     for(int i = 0; i < len; ++i)
     {
         if(c[s[i]] && c[s[i]] < k)
         {
             string l = s.substr(0, i);
             string r = s.substr(i+1);
             return max(longestSubstring(l,k),longestSubstring(r,k));
         }
     }
     
     return len;
 }
    int longestSubstring(string s, int k) {
        if (k > (int)s.size()) {
            return 0;
        }
        vector<int> cnt(26, 0);
        for (int i = 0; i < (int)s.size(); ++i) ++cnt[s[i] - 'a'];

        int mn = INT_MAX;
        for (int i = 0; i < 26; ++i) {
            if (cnt[i] > 0) mn = min(cnt[i], mn);
        }
        if (mn >= k) return s.size();

        int pv = 0;
        int res = 0;
        for (int i = 0; i < (int)s.size(); ++i) {
            if (cnt[s[i] - 'a'] < k) {
                res = max(res, longestSubstring(s.substr(pv, i - pv), k));
                pv = i + 1;
            }
        }
        res = max(res, longestSubstring(s.substr(pv, s.size() - pv), k));
        return res;
    }
    int longestSubstring(string s, int k) {
        
        //deal with edge cases
        if (s.size() == 0 || s.size() < k) return 0;
        if (k==1) return s.size();

        //declare a map for every char's counter
        int count[NO_OF_CHARS];
        memset(count , 0, sizeof(count));
        
        //counting every char
        for (char ch : s) {
            count[ch]++;
        }
        
        int i=0;
        for ( i=0; i<NO_OF_CHARS; i++) {
            if (count[i] !=0 && count[i] < k) break;
        }
        //all of the chars meet the requirement
        if ( i >= NO_OF_CHARS ) return s.size();
        
        // find the most infrequent char
        char least = 0;
        for (int c = 0; c < NO_OF_CHARS; c++) {
            if (count[c] == 0) continue;
            if (least == 0) {
                least = c;
            } else if ( count[c] < count[least]) {
                least = c;
            }
        }
        
        //split the string and run them recursively
        vector<string> subs;
        split(s, least, subs);
        
        int res = 0;
        for (string str: subs) {
            res = max(res, longestSubstring(str, k));
        }
        return res;
        return 0;
    }