LC395关于分治

2020-05-18  本文已影响0人  锦绣拾年
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。

示例 1:

输入:
s = "aaabb", k = 3

输出:
3

最长子串为 "aaa" ,其中 'a' 重复了 3 次。
示例 2:

输入:
s = "ababbc", k = 2

输出:
5

最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
    int longestSubstring(string s, int k) {
        //第一步 k的值要过小的话
        if(k<=1)return s.size();
        
        //重要思路 凡是次数小于特定值的字符不应该被包括
        if(s.length()<k)
            return 0;
        //=0;        
        //字符,所以就直接用128位的数组,根本不需要用map
        map<char,int> ex;
        for(int i=0;i<s.length();i++){
           ex[s[i]]+=1;
            // cout<<ex[s[i]]<<endl;
        }
        int i=0;
        while(i<s.length()&&ex[s[i]]>=k){
            i++;
        }
        if(i==s.length()) return s.length();
        int l=longestSubstring(s.substr(0,i),k);
        
        while(i<s.length()&&ex[s[i]]<k){
            i++;
        }
        int r=0;
        if(i<s.length())
            r=longestSubstring(s.substr(i),k);
        
        return max(l,r);

        
        
        
    }
};

以及有一道Python题解,太精妙了

class Solution:
    def longestSubstring(self, s: str, k: int) -> int:
        if not s:
            return 0
        for c in set(s):
            if(s.count(c))<k:
                return max(self.ongestSubstring(t,k) for t in s.split(c))
        return len(s)
上一篇下一篇

猜你喜欢

热点阅读