leetcode 395. 至少有 K 个重复字符的最长子串(滑动窗口)
生活随笔
收集整理的這篇文章主要介紹了
leetcode 395. 至少有 K 个重复字符的最长子串(滑动窗口)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
給你一個字符串 s 和一個整數(shù) k ,請你找出 s 中的最長子串, 要求該子串中的每一字符出現(xiàn)次數(shù)都不少于 k 。返回這一子串的長度。
示例 1:
輸入:s = “aaabb”, k = 3
輸出:3
解釋:最長子串為 “aaa” ,其中 ‘a(chǎn)’ 重復(fù)了 3 次。
解題思路
枚舉滑動窗口內(nèi)不同字母的個數(shù),限制合法的窗口除了需要滿足題目條件外還必須包含特定數(shù)目的不同字母
代碼
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記錄出現(xiàn)次數(shù)小于k的字母個數(shù),cur窗口內(nèi)不同字母的個數(shù)while (r<n){cnt[s.charAt(r)-'a']++;int i1 = cnt[s.charAt(r) - 'a'];if(i1 ==1)//窗口內(nèi)第一次出現(xiàn)的字母 {cur++;less++;}if(i1==k) less--;//窗口內(nèi)已經(jīng)滿足條件的字母while (cur>i)//不同字母的個數(shù)過多,需要移動窗口直到個數(shù)符合{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;} }總結(jié)
以上是生活随笔為你收集整理的leetcode 395. 至少有 K 个重复字符的最长子串(滑动窗口)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做梦梦到求子是什么意思
- 下一篇: leetcode 896. 单调数列