字符串-滑動窗口-無重復(fù)字符的最長子串(3)

題目

給定一個字符串 s 命浴,請你找出其中不含有重復(fù)字符的 最長子串 的長度娄猫。

示例 1:

輸入: s = "abcabcbb"
輸出: 3
解釋: 因為無重復(fù)字符的最長子串是 "abc",所以其長度為 3生闲。
示例 2:

輸入: s = "bbbbb"
輸出: 1
解釋: 因為無重復(fù)字符的最長子串是 "b"媳溺,所以其長度為 1。
示例 3:

輸入: s = "pwwkew"
輸出: 3
解釋: 因為無重復(fù)字符的最長子串是 "wke"跪腹,所以其長度為 3褂删。
請注意,你的答案必須是 子串 的長度冲茸,"pwke" 是一個子序列屯阀,不是子串缅帘。
示例 4:

輸入: s = ""
輸出: 0

題解

滑動窗口

思路

所謂滑動窗口,即為兩個左右指針难衰,通過左右指針的單向滑動钦无,來遍歷元素,最終得到結(jié)果盖袭。

  1. 首先明確失暂,需要遍歷字符串,求子串(不能剔除元素)鳄虱,那么怎么遍歷所有子串呢弟塞?
        int n = s.length();
        for (int left = 0; left < n; left++) {
            for (int right = 0; right < n; right++) {
                
            }
        }

這是暴力解法,不是滑動窗口拙已,那么怎么能簡化暴力解到滑動窗口呢决记?

  1. [left,right]范圍內(nèi)的滑動窗口倍踪,保存不重復(fù)的字符系宫,如果字符不重復(fù),right不斷右移建车,直到遇到重復(fù)字符扩借,left右移一位,right不動缤至,left右移后潮罪,再次進(jìn)行字符重復(fù)性判斷和right的移動
  2. left左指針遍歷規(guī)則不變,left指針每次右移的時候凄杯,right指針不回縮到left+1位置错洁,因為沒有必要,為什么呢戒突?
    • [left,right]范圍內(nèi)是不重復(fù)子串,那么[left+1描睦,right]范圍肯定也是不重復(fù)的膊存,right也就沒有必要回縮,繼續(xù)在原來位置進(jìn)行新一輪的重復(fù)性判斷和移動就可以了
  3. 遇到重復(fù)字符忱叭,left右移后隔崎,如果left新位置字符和right處字符重復(fù),則left繼續(xù)右移韵丑,如果不重復(fù)爵卒,那么right處原本重復(fù)的字符變成了不重復(fù),被添加到窗口中了撵彻,這樣right就沒有回縮钓株,而是不斷的往右移動

代碼

    private static int lengthOfLongestSubstring(String s) {
        int n = s.length();
        Set<Character> diffrent = new HashSet<>();
        // 右指針
        int right = -1;
        int max = 0;
        // 左指針
        for (int left = 0; left < n; left++) {
            // 不重復(fù)的右指針不斷右移实牡,同時加到set中
            while (right + 1 < n && !diffrent.contains(s.charAt(right + 1))) {
                diffrent.add(s.charAt(right + 1));
                right++;
            }
            // 出現(xiàn)重復(fù)字符,此時可求得一個不重復(fù)字符的子串轴合,和之前最大長度比較创坞,求最大,注意此時重復(fù)的字符還沒有加到set中
            max = Math.max(max, diffrent.size());
            // 左指針右移一位受葛,因為此時left位置到right位置不重復(fù)题涨,那么left+1位置到right位置肯定也不會重復(fù)
            // 如果left位置是重復(fù)字符,那么移除后新一輪就變成了不重復(fù)字符加到了set中总滩,如果left位置不重復(fù)纲堵,那新一輪還是重復(fù)字符,left繼續(xù)右移一位
            diffrent.remove(s.charAt(left));
        }
        return max;
    }

github

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闰渔,一起剝皮案震驚了整個濱河市婉支,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澜建,老刑警劉巖向挖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炕舵,居然都是意外死亡何之,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門咽筋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溶推,“玉大人,你說我怎么就攤上這事奸攻∷馕#” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵睹耐,是天一觀的道長辐赞。 經(jīng)常有香客問我,道長硝训,這世上最難降的妖魔是什么响委? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮窖梁,結(jié)果婚禮上赘风,老公的妹妹穿的比我還像新娘。我一直安慰自己纵刘,他們只是感情好邀窃,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著假哎,像睡著了一般瞬捕。 火紅的嫁衣襯著肌膚如雪鞍历。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天山析,我揣著相機(jī)與錄音堰燎,去河邊找鬼。 笑死笋轨,一個胖子當(dāng)著我的面吹牛秆剪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爵政,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼仅讽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钾挟?” 一聲冷哼從身側(cè)響起洁灵,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掺出,沒想到半個月后徽千,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡汤锨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年双抽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闲礼。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡牍汹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柬泽,到底是詐尸還是另有隱情慎菲,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布锨并,位于F島的核電站露该,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琳疏。R本人自食惡果不足惜有决,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望空盼。 院中可真熱鬧,春花似錦新荤、人聲如沸揽趾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篱瞎。三九已至苟呐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間俐筋,已是汗流浹背牵素。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留澄者,地道東北人笆呆。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像粱挡,于是被迫代替她去往敵國和親赠幕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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