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