給你一個字符串 s 和一個整數 k ,請你找出 s 中的最長子串, 要求該子串中的每一字符出現次數都不少于 k 。返回這一子串的長度。
示例 1:
輸入:s = “aaabb”, k = 3
輸出:3
解釋:最長子串為 “aaa” ,其中 ‘a’ 重復了 3 次。
解題思路
枚舉滑動窗口內不同字母的個數,限制合法的窗口除了需要滿足題目條件外還必須包含特定數目的不同字母
代碼
class Solution {public int longestSubstring(String s, int k) {int n=s.length(),len=0;for (int i = 1; i <=26; i++) {int[] cnt=new int[26];int l=0,r=0,total=0,less=0,cur=0;
//less記錄出現次數小于k的字母個數,cur窗口內不同字母的個數while (r<n){cnt[s.charAt(r)-'a']++;int i1 = cnt[s.charAt(r) - 'a'];if(i1 ==1)//窗口內第一次出現的字母 {cur++;less++;}if(i1==k) less--;//窗口內已經滿足條件的字母while (cur>i)//不同字母的個數過多,需要移動窗口直到個數符合{if(cnt[s.charAt(l)-'a']==1){less--;cur--;}if(cnt[s.charAt(l)-'a']==k){less++;}cnt[s.charAt(l)-'a']--;l++;}if(less==0)len= Math.max(len,r-l+1);r++;}}return len;}
}