[Leetcode] 98. Longest Substring with At Least K Repeating Characters

題目

Find the length of the longest substring T of a given string (consists of lowercase letters only) such that every character in T appears no less than k times.

Example 1:

Input:
s = "aaabb", k = 3

Output:
3

The longest substring is "aaa", as 'a' is repeated 3 times.

Example 2:

Input:
s = "ababbc", k = 2

Output:
5

The longest substring is "ababb", as 'a' is repeated 2 times and 'b' is repeated 3 times.

解題之法

class Solution {
public:
    int longestSubstring(string s, int k) {
        int res = 0, i = 0, n = s.size();
        while (i + k <= n) {
            int m[26] = {0}, mask = 0, max_idx = i;
            for (int j = i; j < n; ++j) {
                int t = s[j] - 'a';
                ++m[t];
                if (m[t] < k) mask |= (1 << t);
                else mask &= (~(1 << t));
                if (mask == 0) {
                    res = max(res, j - i + 1);
                    max_idx = j;
                }
            }
            i = max_idx + 1;
        }
        return res;
    }
};

分析

這道題給了我們一個字符串s和一個正整數(shù)k,讓我們求一個最大子字符串并且每個字符必須至少出現(xiàn)k次。難點在于如何快速的判斷某一個字符串是否所有的元素都已經(jīng)滿足了至少出現(xiàn)k次這個條件册倒,雖然用哈希表建立了字符和其出現(xiàn)次數(shù)之間的映射,但是如果每一次都要遍歷哈希表中的所有字符看其出現(xiàn)次數(shù)是否大于k思犁,未免有些不高效。
而用mask就很好的解決了這個問題进肯,由于字母只有26個激蹲,而整型mask有32位,足夠用了江掩,每一位代表一個字母学辱,如果為1,表示該字母不夠k次环形,如果為0就表示已經(jīng)出現(xiàn)了k次策泣,這種思路真是太聰明了。
我們遍歷字符串抬吟,對于每一個字符萨咕,我們都將其視為起點,然后遍歷到末尾火本,我們增加哈希表中字母的出現(xiàn)次數(shù)危队,如果其小于k,我們將mask的對應位改為1钙畔,如果大于等于k茫陆,將mask對應位改為0。然后看mask是否為0擎析,是的話就更新res結(jié)果簿盅,然后把當前滿足要求的子字符串的起始位置j保存到max_idx中,等內(nèi)層循環(huán)結(jié)束后叔锐,將外層循環(huán)變量i賦值為max_idx+1挪鹏,繼續(xù)循環(huán)直至結(jié)束。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愉烙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子解取,更是在濱河造成了極大的恐慌步责,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蔓肯,居然都是意外死亡遂鹊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門蔗包,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秉扑,“玉大人,你說我怎么就攤上這事调限≈勐剑” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵耻矮,是天一觀的道長秦躯。 經(jīng)常有香客問我,道長裆装,這世上最難降的妖魔是什么踱承? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮哨免,結(jié)果婚禮上茎活,老公的妹妹穿的比我還像新娘。我一直安慰自己琢唾,他們只是感情好妙色,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慧耍,像睡著了一般身辨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芍碧,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天煌珊,我揣著相機與錄音,去河邊找鬼泌豆。 笑死定庵,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的踪危。 我是一名探鬼主播蔬浙,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贞远!你這毒婦竟也來了畴博?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蓝仲,失蹤者是張志新(化名)和其女友劉穎俱病,沒想到半個月后官疲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡亮隙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年途凫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溢吻。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡维费,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出促王,到底是詐尸還是另有隱情犀盟,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布硼砰,位于F島的核電站且蓬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏题翰。R本人自食惡果不足惜恶阴,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豹障。 院中可真熱鬧冯事,春花似錦、人聲如沸血公。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽累魔。三九已至摔笤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垦写,已是汗流浹背吕世。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梯投,地道東北人命辖。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像分蓖,于是被迫代替她去往敵國和親尔艇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

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