力扣3. 无重复字符的最长子串 two pointer算法|滑动窗口|尺取法
給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。
示例 1:
輸入: “abcabcbb”
輸出: 3
解釋: 因為無重復字符的最長子串是 “abc”,所以其長度為 3。
示例 2:
輸入: “bbbbb”
輸出: 1
解釋: 因為無重復字符的最長子串是 “b”,所以其長度為 1。
示例 3:
輸入: “pwwkew”
輸出: 3
解釋: 因為無重復字符的最長子串是 “wke”,所以其長度為 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
題解:
樸素解法當然是考慮n^2算法,就是枚舉兩個端點,選出最優解
是否可以優化?
比如abcabcbb串中
abcabcbb
abc
??bca
由abc直接跳到bca而不再暴力搜索 b,bc,是因為我們在abc這里就已經知道bc是符合條件的字串,只是由于a與新字符不滿足條件所以我們要拿掉a,防止重復考慮剩下的滿足條件的字符串,最終得到解.
所以高效一點的解法就是用兩個指針分別指向滿足條件的左端和右端,若是滿足條件就讓右指針++前進,不滿足條件,就讓左指針++前進到滿足條件的位置繼續搜索,這個算法就是twopointer算法,也可以叫滑動窗口算法,因為這個算法left和right兩個指針走一遍序列就可以搜出最優解,所以是O(n).
這個算法可以巧妙地避免中間已經比較過的序列,減少二次比較從而優化算法效率.
我們可以保存一個當前子串中的字符的位置,如果這個字符之前遇到過,我們就讓left前進到這個之前遇到過的位置的后一個元素,讓后++的過程把這些字符都從我們的保存位置表中刪掉.這樣就能減少重復比較,沒必要讓left+1后再進行條件判斷.
總結
以上是生活随笔為你收集整理的力扣3. 无重复字符的最长子串 two pointer算法|滑动窗口|尺取法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: maven project创建填充项
- 下一篇: 电子邮件收发这样实现!!!