---
# System prepended metadata

title: 395. Longest Substring with At Least K Repeating Characters
tags: [string, Leetcode, medium, python, c++, divide and conquer]

---

###### tags: `Leetcode` `medium` `string` `divide and conquer` `python` `c++`

# 395. Longest Substring with At Least K Repeating Characters

## [題目連結:] https://leetcode.com/problems/longest-substring-with-at-least-k-repeating-characters/description/

## 題目:
Given a string ```s``` and an integer ```k```, return the length of the longest substring of ```s``` such that the frequency of each character in this substring is greater than or equal to ```k```.

**Example 1:**
```
Input: s = "aaabb", k = 3
Output: 3
Explanation: The longest substring is "aaa", as 'a' is repeated 3 times.
```
**Example 2:**
```
Input: s = "ababbc", k = 2
Output: 5
Explanation: The longest substring is "ababb", as 'a' is repeated 2 times and 'b' is repeated 3 times.
```

## 解題想法:
* 此題為給一個字符串s和一個正整數k:
    * 求一個最大子字符串且每個字符必須至少出現k次。

* Divide and Conquer
    * **判斷當前字符個數是否小於k**
        * 若小於k，表示相當於遞迴求不包含此字符的子字串了


## Python:
``` python=
class Solution(object):
    def longestSubstring(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: int
        """
        if len(s)<k:
            return 0
        for char in set(s): #不用考慮重複
            if s.count(char)<k: 
                return max(self.longestSubstring(sub,k) for sub in s.split(char))
        return len(s)

s = "ababbc"
k = 2
result= Solution()
ans=result.longestSubstring(s,k)
print(ans)
```

## C++:
* 因為c++沒有split
* 所以用substr分割，最後記得後半段也要遞迴判斷到
``` cpp=
class Solution {
public:
    int longestSubstring(string s, int k) {
        int n=s.size(), index=0,res=0;
        bool SplitorNot=false;
        unordered_map<char, int> dic;
        for (char val: s){
            dic[val]+=1;
        }
        for (int i=0; i<n; i++){
            if (dic[s[i]]<k){
                //substr(start, step): 字串s從start起的step個字元
                res=max(res, longestSubstring(s.substr(index,i-index), k)); //前半段
                SplitorNot=true; // already split
                index=i+1;
            }
        }
        //若沒分割過: SplitorNot=false : 直接return s.size()即可
        //否則要判斷index~最後位置的子字串是否還有機會大於res
        return (!SplitorNot) ? n : max(res,longestSubstring(s.substr(index,n-1), k));
    }
};
```