一、前言
每天五分鐘,看懂一道簡單、中等難度的算法題
瘋狂學習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