題目:給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。測試
示例 1:優化
輸入: "abcabcbb"
輸出: 3
解釋: 由於無重複字符的最長子串是 "abc",因此其長度爲 3。spa
示例 2:code
輸入: "bbbbb"
輸出: 1
解釋: 由於無重複字符的最長子串是 "b",因此其長度爲 1。圖片
示例 3:leetcode
輸入: "pwwkew"
輸出: 3
解釋: 由於無重複字符的最長子串是 "wke",因此其長度爲 3。字符串
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
解答:
1.暴力破解string
var lengthOfLongestSubstring = function(s) { var l = s.length; var re = 0; for (var i= 0; i < l; i++) { //1 for(var j = i + 1; j <= l; j++){ //2 if(check(i, j)) { re = Math.max(re, j - i) } else { break } } } function check(start, end) { var a = []; for (var k = start; k < end; k++) { //3 if (a.indexOf(s[k]) !== -1) { return false } else { a.push(s[k]) } } return true; } return re };
上來就是一頓for循環操做,這樣暴力寫咱們的leetcode確定是不會給過的,由於遇到超級長的字符串測試用例,執行時間會超出時間限制,上面代碼的優化空間很大。
理一下邏輯,咱們每次在2裏面檢測出有重複的字符時,記錄這個重複字符前一次出現的位置index,而後中斷此次循環,開始下一次1的循環,而且i的位置應該爲index+1。
好比在i=0的時,在2循環裏j=4時就會出現重複的字符d,字符d前一次出現的位置是1,這時最長字符串長度是4,而且被記錄,這時應該開始1循環的下一次循環,而且是從i=2開始。
3循環和2循環實際上是沒必要要的,咱們建立一個動態的字符串,把每次循環到的字符加進去並實時記錄它的長度,遇到重複的字符串就砍掉字符第一次出現跟它以前的字符串,好比上圖,i循環到4時,出現重複字符d,d在以前出現的位置是1,咱們應該砍掉動態字符串位置1跟它以前的字符串,來保證它是無重複的字符串。代碼以下it
var lengthOfLongestSubstring = function(s) { var l = s.length; var re = 0; var a = '', index; for (var i = 0; i < l; i++) { index = a.indexOf(s[i]) if (index !== -1) { a = a.slice(index + 1) } a+=s[i] re = Math.max(re, a.length); } return re };
一下從矮窮挫變成高富帥,速度槓槓噠!io