【LeetCode笔记】3. 无重复字符的最长子串(JAVA、滑动窗口、字符串)
生活随笔
收集整理的這篇文章主要介紹了
【LeetCode笔记】3. 无重复字符的最长子串(JAVA、滑动窗口、字符串)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 題目描述
- 思路 && 代碼
- 1. 之前的版本
- 更新 2.0
題目描述
- 子串:各字符間必須要相鄰,而非子序列
- 使用滑動窗口來做就行
思路 && 代碼
1. 之前的版本
- 思路:維護一個滑動窗口,滑動窗口中容納一個無重復字符的子串。
- 滑動窗口左邊界移動的情況:
- 【abc】 a => a【bca】
- 【abcd】 c => abc【dc】
- 其實以上兩種情況殊途同歸,都是把左邊界換成當前判斷字符在HashMap中對應的下標的位置的后一個。
然后把前面的字符全都丟棄即可(在HashMap中remove())。 - 左邊界移動的情況,需要進行長度的判斷:當前滑動窗口長度可能會改變,如果比當前存儲的最大長度要大,那么就需要更新。
- 為什么可以這樣子:特別記錄一下,這道題其實老早就通過了。。但是之后考慮情況多了,出現(xiàn)了覺得自己寫的代碼其實考慮不周,但是就是過了的情況= =。
主要是有這個注意點:在上面的左邊界移動情況2,考慮到abc都被丟棄,但是有沒有可能a、b實際上可能可以創(chuàng)造最長子串呢? 答案是沒有,因為實際上最多的長度【abcd】已經(jīng)被記錄下來了,b最多就是【bcd】c的情況,a也同理,因此已經(jīng)可以直接丟棄掉了。
- 時間復雜度:O(N),實際上整個流程本質上就是對字符串的每一個元素都必然訪問一次,可能刪除一次。
- 空間復雜度:O(字符集的大小),因為我們需要簡歷哈希表,而表最大的情況下會容納整個字符集(及對應下標)。
更新 2.0
- 比較精簡的代碼
總結
以上是生活随笔為你收集整理的【LeetCode笔记】3. 无重复字符的最长子串(JAVA、滑动窗口、字符串)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux内存管理_浅谈Linux内存管
- 下一篇: lombok依赖_使用Lombok 前你