340. Longest Substring with At Most K Distinct Characters

Given a string, find the length of the longest substring T that contains at most k distinct characters.

For example, Given s = “eceba” and k = 2,

T is "ece" which its length is 3.

一刷
解法同159侧但, 就是用一個(gè)map存character, index. 保證map的size小于k, 否則,尋找map中entry擁有最小的value旋恼。但是有更快的方法泊交,比如有序的map. 留給二刷

class Solution {
    public int lengthOfLongestSubstringKDistinct(String s, int k) {
        if(k == 0 || s == null || s.length()==0) return 0;
        int res = 0;
        Map<Character, Integer> map = new HashMap<>();
        int left = 0, right = 0;
        for(int i=0; i<s.length(); i++){
            char ch = s.charAt(i);
            if(map.size()<k || map.containsKey(ch)){
                map.put(ch, i);
                res = Math.max(res, i-left+1);
            }else{
                //find the minimum in the map
                int value = Integer.MAX_VALUE;
                char key = 'a';
                for(Map.Entry<Character, Integer> entry : map.entrySet()){
                    if(entry.getValue()<value) {
                        value = entry.getValue();
                        key = entry.getKey();
                    }
                }
                map.remove(key);
                map.put(ch, i);
                left = value+1;
                res = Math.max(res, i-left+1);
            }
        }
        return res;
    }
}

二刷
詞頻統(tǒng)計(jì)array, sliding window
如果是該char第一次出現(xiàn)疑务,count++
如果count>k, 那么從start開(kāi)始remove, 如果remove后,詞頻數(shù)組顯示這個(gè)ch沒(méi)有出現(xiàn),那么count--, 直到count==k

class Solution {
    // Solution 1: two pointer
    // Solution 2: TreeMap<>. dealing with stream input
    public int lengthOfLongestSubstringKDistinct(String s, int k) {
        char[] arr = s.toCharArray();
        int[] table = new int[256];
        int start = 0;
        int maxLen = 0;
        int count = 0;
        for(int end = 0; end < arr.length; end++) {
            if(table[arr[end]]++ == 0) {
                count++;
                while(count > k) {
                    if(--table[arr[start++]] == 0) {
                        count--;
                    }
                }
            }
            maxLen = Math.max(maxLen, end - start + 1);
        }
        return maxLen;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镇辉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贴捡,更是在濱河造成了極大的恐慌忽肛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烂斋,死亡現(xiàn)場(chǎng)離奇詭異屹逛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)汛骂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門罕模,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人帘瞭,你說(shuō)我怎么就攤上這事淑掌。” “怎么了蝶念?”我有些...
    開(kāi)封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵抛腕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我媒殉,道長(zhǎng)担敌,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任廷蓉,我火速辦了婚禮柄错,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己售貌,他們只是感情好给猾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著颂跨,像睡著了一般敢伸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恒削,一...
    開(kāi)封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天池颈,我揣著相機(jī)與錄音,去河邊找鬼钓丰。 笑死躯砰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的携丁。 我是一名探鬼主播琢歇,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梦鉴!你這毒婦竟也來(lái)了李茫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肥橙,失蹤者是張志新(化名)和其女友劉穎魄宏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體存筏,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宠互,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了椭坚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片名秀。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖藕溅,靈堂內(nèi)的尸體忽然破棺而出匕得,到底是詐尸還是另有隱情,我是刑警寧澤巾表,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布汁掠,位于F島的核電站,受9級(jí)特大地震影響集币,放射性物質(zhì)發(fā)生泄漏考阱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一鞠苟、第九天 我趴在偏房一處隱蔽的房頂上張望乞榨。 院中可真熱鬧秽之,春花似錦、人聲如沸吃既。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鹦倚。三九已至河质,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間震叙,已是汗流浹背掀鹅。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媒楼,地道東北人乐尊。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像划址,于是被迫代替她去往敵國(guó)和親扔嵌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容