LeetCode 395 至少有 K 个重复字符的最长子串 - 分治解法

LeetCode 395 至少有 K 个重复字符的最长子串 - 分治解法

🟠 中等偏上 https://leetcode.cn/problems/longest-substring-with-at-least-k-repeating-characters/

思路

这题思路不太直观,可以用滑动窗口,也可以用分治。

分治关键在于“如何切分”:

  • 若某字符在当前字符串中的出现次数小于 k,它不可能出现在合法答案中。
  • 因此可以把这些字符当作分隔符,把原串切成多个子串,分别递归求解,再取最大值。
class Solution {

public:

    int longestSubstring(string s, int k) {

        unordered_map<char,int> hash_map;

        for(auto c:s) hash_map[c]++;

        vector<int> split_index;

        for(int i = 0;i<s.size();i++){

            if(hash_map[s[i]]<k){

                split_index.push_back(i);

            }

        }

        if(split_index.size()==0) return s.size();

  

        int ans = 0;

        int left = 0;

        split_index.push_back(s.size());

        for(int i = 0;i<split_index.size();i++){

            int len = split_index[i]-left;

            if(len>ans) ans = max(ans,longestSubstring(s.substr(left,len),k));

            left = split_index[i]+1;

        }

        return ans;

  

    }

};