【JS攻略Leetcode】No.3. Longest Substring Without Repeating Characters(無重復(fù)字符的最長子串)

引言:用Js攻略leetcode中的算法这揣,將會(huì)介紹自己的思路和注意點(diǎn)涝开,一邊學(xué)習(xí)一邊愉快刷題呀穗酥。

問題:

給定一個(gè)字符串护赊,找出不含有重復(fù)字符的最長子串的長度惠遏。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 無重復(fù)字符的最長子串是 "abc",其長度為 3骏啰。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 無重復(fù)字符的最長子串是 "b"节吮,其長度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 無重復(fù)字符的最長子串是 "wke"判耕,其長度為 3透绩。
請(qǐng)注意,答案必須是一個(gè)子串壁熄,"pwke" 是一個(gè)子序列 而不是子串帚豪。

思考:

采用動(dòng)態(tài)的劃窗來查找無重復(fù)子串,用noRepeatHead指示當(dāng)前劃窗的起始位置草丧,noRepeatEnd指示當(dāng)前劃窗的下一個(gè)需要驗(yàn)證的元素,當(dāng)前不重復(fù)的字符組成的劃窗子串為initialString狸臣。
初始時(shí):


查找noRepeatEnd對(duì)應(yīng)的元素是否在initialString中存在,若不存在昌执,劃窗自動(dòng)加上這個(gè)元素烛亦,然后變成下面的狀態(tài):


若元素已經(jīng)存在,直接截取從重復(fù)元素到當(dāng)前元素的字符串懂拾,保持整個(gè)字符串中字符不重復(fù)煤禽。
(因?yàn)橹蟮淖址赡芨L,比如‘a(chǎn)bcbedg’, 原先的initialString為abc, 第四個(gè)字符‘b’在initialString中岖赋,直接截取‘cb’檬果,再往后判斷,因?yàn)橥罂赡苡凶哟饶壳暗淖畲箝L度3還要大贾节,例如‘cbedg’的長度5)
因?yàn)榻厝『箝L度肯定不大于之前noRepeatHead和noRepeatEnd之間的長度汁汗,所以直接不判斷temp(當(dāng)前initialString的長度)和返回值(nowMaxLength)的大小


直到noRepeatHead到達(dá)字符串末尾結(jié)束(下圖 noRepeatEnd == s.length 了):


或者從noRepeatHead到字符串末尾的長度已經(jīng)不能超過當(dāng)前的最大長度(nowMaxLength)了,自然就不關(guān)心是否要繼續(xù)判斷:


noRepeatHead = 5, s.length = 8, nowMaxLength = 3栗涂, 所以最后三個(gè)就不用判斷啦

代碼:

/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
    var result = 0;
    if(s.length <= 1) {
        return s.length;
    }
    var nowMaxLength = 1, noRepeatHead = 0, noRepeatEnd = 1;
    var initialString = s[0]; var temp = 1, index = -1;
    do {
           index = initialString.indexOf(s[noRepeatEnd]);
           if(index == -1) {
                temp++;
                if(temp>nowMaxLength){
                    nowMaxLength  = temp;
                }
                initialString  +=  s[noRepeatEnd];
                noRepeatEnd ++;
            } else {
                noRepeatHead = noRepeatHead+ index + 1;//重復(fù)的話就把頭移到重復(fù)元素的下一個(gè)元素上知牌;
                noRepeatEnd ++;
                initialString = s.substring(noRepeatHead, noRepeatEnd);
                temp = initialString.length;
            }
      }while(noRepeatHead < (s.length - nowMaxLength) && (noRepeatEnd < s.length));
      return nowMaxLength;
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市斤程,隨后出現(xiàn)的幾起案子角寸,更是在濱河造成了極大的恐慌,老刑警劉巖忿墅,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扁藕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡疚脐,警方通過查閱死者的電腦和手機(jī)亿柑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棍弄,“玉大人望薄,你說我怎么就攤上這事疟游。” “怎么了痕支?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵颁虐,是天一觀的道長。 經(jīng)常有香客問我卧须,道長另绩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任花嘶,我火速辦了婚禮笋籽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椭员。我一直安慰自己干签,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布拆撼。 她就那樣靜靜地躺著,像睡著了一般喘沿。 火紅的嫁衣襯著肌膚如雪闸度。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天蚜印,我揣著相機(jī)與錄音莺禁,去河邊找鬼。 笑死窄赋,一個(gè)胖子當(dāng)著我的面吹牛哟冬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忆绰,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼浩峡,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了错敢?” 一聲冷哼從身側(cè)響起翰灾,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稚茅,沒想到半個(gè)月后纸淮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亚享,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年咽块,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欺税。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侈沪,死狀恐怖揭璃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峭竣,我是刑警寧澤塘辅,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站皆撩,受9級(jí)特大地震影響扣墩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扛吞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一呻惕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滥比,春花似錦亚脆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寺滚,卻和暖如春柑营,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背村视。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國打工官套, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚁孔。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓奶赔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杠氢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子站刑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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