給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。
示例:
輸入: "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初始化...