Python3 無重複字符的最長子串的實現

這篇文章主要介紹了Python3 無重複字符的最長子串的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨着小編來一起學習學習吧

題目:

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

示例:

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

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

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

思路:

這道題會很自然的想到暴力解法,就是按位遞增依次檢查子串是否重複,並記下目前最大的子串長度,如果重複就從下一位索引處的字符開始重新檢查。下面是代碼實現:

class Solution:
 def lengthOfLongestSubstring(self, s: str) -> int:
 # 最長子串的長度
 max_len = 0
 # 存放字符的字典
 char_dict = {}
 index = 0
 while s[index:].__len__() >= max_len:
  # 當前最長子串長度
  current_len = 0
  for item in s[index:]:
  old_index = char_dict.get(item)
  if old_index is not None:
   index = old_index + 1
   char_dict.clear()
   break
  char_dict[item] = index
  index += 1
  current_len += 1
  if current_len > max_len:
  max_len = current_len
 return max_len

開始只是想跑通,沒想到超出了時間限制。看起來代碼顯得是有點囉嗦,但是思路應該是沒有問題的,我們還是從遍歷的角度來優化。

優化:

在上面的代碼中,當遇到重複字符時,遍歷的起始點就往後挪一位,但其實兩個重複字符之間的部分是不會重複的,比如字符串fbacdadfeed,在第一次從 f 開始遍歷遇到重複字符即第二個 a 的時候,下一次遍歷不應該從 b 開始,而是應該從前一個重複字符的後一個字符即 c 開始。

確定思想,並多次優化後的代碼如下:

class Solution:
  def lengthOfLongestSubstring(self, s: str) -> int:
    char_dict = {}
    start, end, max_len = -1, 0, 0
    str_len = s.__len__()
    while end < str_len:
      char = s[end]
      if char in char_dict:
        old_index = char_dict[char]
        if old_index > start:
         start = old_index 
      diff = end -start
      if diff > max_len:
        max_len = diff 
      char_dict[char] = end
      end += 1
    return max_len;

這裏使用了內置的.__len__()方法來獲取字符串長度而不是len(),並且使用了多個看似多此一舉的臨時變量來存儲值,比如char和diff,都是爲了節省時間,蚊子小也是肉嘛。

結果也是 ok 的:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持神馬文庫。

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