【5分鐘力扣】3. 無重複字符的最長子串

一、前言

每天五分鐘,看懂一道簡單、中等難度的算法題
瘋狂學習python中,每天持續更新
書山有路勤爲徑,學海無涯苦作舟;與君初相識,猶如故人歸。

在這裏插入圖片描述

二、題目

給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。

示例 1:

輸入: “abcabcbb”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “abc”,所以其長度爲 3。

示例 2:

輸入: “bbbbb”
輸出: 1
解釋: 因爲無重複字符的最長子串是 “b”,所以其長度爲 1。

示例 3:

輸入: “pwwkew”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “wke”,所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

三、解答思路

3.1總體思路

先循環遍歷字符串,用字典記錄字符和字符下標,同時記錄字符長度(res),如果在後面循環中出現字典中已經記錄的字符,那麼設置一個變量(start) 指向第一個重複字符位置,然後從上一個重複字符開始獲取新的子字符串長度,並用res和新字符串對比,將最大值賦值給res,最後返回res。

3.2流程圖

在這裏插入圖片描述

3.3 圖解過程

在這裏插入圖片描述

五、代碼實例

"""
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。

示例 1:

輸入: "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:

輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
"""

s1 = "abcaefda"

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if len(s) == 0:
            return 0
        res, start, cache = 0, 0, {}
        # 一、先遍歷字符串的字符和下標,並以字典形式存儲
        for idx, i in enumerate(s):
            if i in cache and cache[i] >= start:
                start = cache[i]+1  # 字符在字符串中實際位置
                cache[i] = idx
            else:
                cache[i] = idx
                # cur = idx+1-start  # 記錄子字符串長度
                res = max(idx+1-start, res)  # 省略一步
        return res


if __name__ == '__main__':
    obj = Solution()
    print(obj.lengthOfLongestSubstring(s1))

    
    # 結果爲 6

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章