Python編程題16--最長不重複子串

題目

給定一個字符串,請從這個字符串中找出所有最長的沒有重複字符的子串,並返回最長不重複子串的長度。

例如:

字符串:mabcafrab ==> 最長不重複子串:bcafr,長度5

字符串:pwswekedw ==> 最長不重複子串:swek, kedw,長度4

實現思路

  • 設置一個字典 temp_dict ,用於存儲每個字符在字符串中的最新位置
  • 設置一個列表 str_list ,用於存儲不同的子串
  • 設置兩個變量 start、max_length,分別表示 計算子串長度時的起始索引下標 和 最大子串長度
  • 遍歷字符串,如果當前字符已在字典中,那麼直接更新 start 的值,比較 temp_dict[cur] + 1(該字符所在位置 + 1)、start ,取其中的最大值
  • 計算子串時,從 start 到 i 的子串長度爲 i - start + 1 ,如果該長度大於 max_length ,那麼就更新 max_length 爲 i - start + 1 ,同時將這裏的子串存儲到列表 str_list 中
  • 遍歷的時候,每次都要把當前字符及其最新位置存儲到 temp_dict 中
  • 從列表 str_list 中,找出元素長度爲 max_length 的所有子串
  • 最後返回最長不重複的所有子串及其長度

代碼實現

def get_longest_string(s):
    temp_dict = {}
    str_list = []
    start, max_length = 0, 0
    for i in range(len(s)):
        cur = s[i]
        if cur in temp_dict:
            start = max(temp_dict[cur] + 1, start)
        if i - start + 1 >= max_length:
            max_length = i - start + 1
            str_list.append(s[start:i+1])
        temp_dict[cur] = i
    res_str = ", ".join([i for i in str_list if len(i) == max_length])
    return res_str, max_length

s1 = "mabcafrab"
res = get_longest_string(s1)
# 最長不重複子串爲:bcafr ,其長度爲:5
print("字符串 {:20} 中,最長不重複子串爲:{:20},其長度爲:{:2}".format(s1, res[0], res[1]))

s2 = "pwswekedw"
res = get_longest_string(s2)
# 最長不重複子串爲:swek, kedw ,其長度爲:4
print("字符串 {:20} 中,最長不重複子串爲:{:20},其長度爲:{:2}".format(s2, res[0], res[1]))

s3 = "abcabb"
res = get_longest_string(s3)
# 最長不重複子串爲:abc, bca, cab ,其長度爲:3
print("字符串 {:20} 中,最長不重複子串爲:{:20},其長度爲:{:2}".format(s3, res[0], res[1]))

s4 = "pwwkew"
res = get_longest_string(s4)
# 最長不重複子串爲:wke, kew ,其長度爲:3
print("字符串 {:20} 中,最長不重複子串爲:{:20},其長度爲:{:2}".format(s4, res[0], res[1]))

s5 = "p"
res = get_longest_string(s5)
# 最長不重複子串爲:p ,其長度爲:1
print("字符串 {:20} 中,最長不重複子串爲:{:20},其長度爲:{:2}".format(s5, res[0], res[1]))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章