LeetCode無重複字元的最長子串JS實現

2021-10-04 04:28:47 字數 1568 閱讀 8734

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。

示例:

輸入: "abcabcbb"

輸出: 3

解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

輸入: "bbbbb"

輸出: 1

解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。

輸入: "pwwkew"

輸出: 3

解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。

請注意,你的答案必須是 子串 的長度,「pwke」 是乙個子串行,不是子串。

由於時間限制,會出現 tle

思路逐個檢查所有的子字串,看它是否不含有重複的字元。

複雜度時間複雜度:o(n

3)

o(n^3)

o(n3)思路

滑動視窗是陣列/字串問題中常用的抽象概念。 視窗通常是在陣列/字串中由開始和結束索引定義的一系列元素的集合,即 [i, j)[i,j)(左閉,右開)。而滑動視窗是可以將兩個邊界向某一方向「滑動」的視窗。例如,我們將 [i, j)[i,j) 向右滑動 11 個元素,則它將變為 [i+

1,j+

1)

[i+1, j+1)

[i+1,j

+1)(左閉,右開)

我們使用 雜湊表(map) 將字元儲存在當前視窗 [i,

j)

[i, j)

[i,j

)(最初 j = ij=i)中。 然後我們向右側滑動索引 j

jj,如果它不在 雜湊表(map) 中,我們會繼續滑動 j

jj。直到 s[j

]s[j]

s[j]

已經存在於 雜湊表(map) 中。此時,我們找到的沒有重複字元的最長子字串將會以索引 i

ii 開頭。如果我們對所有的 i

ii 這樣做,就可以得到答案。

/**

* @param s

* @return

*/var

lengthoflongestsubstring

=function

(s)else

}return ans;

};

複雜度上述的方法最多需要執行 2n 個步驟。事實上,它可以被進一步優化為僅需要 n 個步驟。我們可以定義字元到索引的對映,而不是使用集合來判斷乙個字元是否存在。 當我們找到重複的字元時,我們可以立即跳過該視窗。

/**

* @param s

* @return

*/var

lengthoflongestsubstring

=function

(s) ans = math.

max(ans, j - i +1)

; map.

set(s[j]

,j+1)}

return ans;

};

複雜度

LeetCode第3題題解 無重複字元的最長子串

題目 leetcode 題目描述 給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 ...

LeetCode刷題實戰3 無重複字元的最長子串

題目描述 給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。示例 1 輸入 s abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 s bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 s pww...

leetcode刷題之路3 無重複字元的最長子串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。字元陣列和字串的區別,c語言字元陣列和字串區別詳解 開始的想法是在對字元陣列設定兩個指標,初始化乙個在位置0乙個在位置1,ans初始化...