Leetcode-3 無(wú)重復(fù)字符的最長(zhǎng)子串 Python

1. 題目

給定一個(gè)字符串,請(qǐng)你找出其中不含有重復(fù)字符的 最長(zhǎng)子串 的長(zhǎng)度。

示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "abc",所以其長(zhǎng)度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "b",所以其長(zhǎng)度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "wke",所以其長(zhǎng)度為 3。
請(qǐng)注意,你的答案必須是 子串 的長(zhǎng)度,"pwke" 是一個(gè)子序列,不是子串。

2. 解題思路

2.1 樸素解法,暴力搜索

為了枚舉給定字符串的所有子字符串,我們需要枚舉它們開(kāi)始和結(jié)束的索引。假設(shè)開(kāi)始和結(jié)束的索引分別為 ij。那么我們有 0 \leq i \lt j \leq n ,0≤i<j≤n(這里的結(jié)束索引 j 是按慣例排除的)。因此,使用 i 從0到n - 1,n?1 以及 j 從 i+1 到 n 這兩個(gè)嵌套的循環(huán),我們可以枚舉出 s 的所有子字符串。

要檢查一個(gè)字符串是否有重復(fù)字符,我們可以使用集合。我們遍歷字符串中的所有字符,并將它們逐個(gè)放入 set 中。在放置一個(gè)字符之前,我們檢查該集合是否已經(jīng)包含它。如果包含,我們會(huì)返回 false。循環(huán)結(jié)束后,我們返回 true。

2.2 滑動(dòng)窗口

利用python 的字典,或者java中的Map<Character, Integer> map
存儲(chǔ)每個(gè)字符出現(xiàn)位置的索引。
使用變量end來(lái)記錄上次該字符出現(xiàn)的位置長(zhǎng)度,刪掉從該字符前一次出現(xiàn),及其以前的重復(fù)出現(xiàn),也可以理解成不重復(fù)字符串的開(kāi)始位置;
使用變量m來(lái)記錄不重復(fù)字符出現(xiàn)的最大長(zhǎng)度;
each是遍歷字符串的當(dāng)前index

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if len(s) == 0 : return 0
        end = 0
        dic = {}
        m = 0
        for each in range(len(s)):
            if s[each] in dic :
                end = max(end,dic[s[each]]+1)
            dic[s[each]] = each
            m = max(m,each-end+1)
            
        return m

第二種理解思路
求無(wú)重復(fù)字符的最長(zhǎng)子串的長(zhǎng)度,從頭到尾遍歷字符串時(shí)(索引index),考慮到無(wú)重復(fù)字符,我們先把字符逐個(gè)放到容器set中,并更新最長(zhǎng)子串的長(zhǎng)度,如果遇到了重復(fù)字符,即當(dāng)前遍歷的字符在set中,則要從set中刪除重復(fù)字符,包括這個(gè)重復(fù)字符前面的所有字符,也就是從當(dāng)前子串的最左邊(left)開(kāi)始刪除,直到刪除重復(fù)字符

3. 總結(jié)/分類

字符串,滑動(dòng)窗口

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容