LeetCode (力销) 03 Frage: Der längste Teilstring ohne wiederholte Zeichen ---- iterative Schiebefensterlösung mit detaillierten Notizen

题目描述

Ermitteln Sie bei gegebener Zeichenfolge die Länge der längsten Teilzeichenfolge, die keine wiederholten Zeichen enthält, und geben Sie deren Länge zurück.

示例

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

输入: s = ""
输出: 0

思路

Der Titel besteht darin, uns den längsten Teilstring zu finden, der keine wiederholten Elemente enthält. Dann reicht ein Durchlauf aus. Solange ein wiederholtes Element angetroffen wird, nehmen wir direkt den Teil nach dem wiederholten Element des aktuellen Teilstrings und fahren mit der Durchquerung fort rückwärts und wählen Sie schließlich die längste Teilzeichenfolge aus. Nur eine Zeichenfolge. Beispiel: s = 'abcabc'. Angenommen, wir sind zum ersten 'c' übergegangen, dann ist die aktuelle Teilzeichenfolge 'abc' und das nächste Element ist 'a'. Es ist ersichtlich, dass 'a' bereits in vorhanden ist Im aktuellen Teilstring „abc“ entfernen wir die wiederholten Elemente, nehmen „bc“ (entfernen „a“) ​​im aktuellen Teilstring und bewegen uns dann weiter nach unten. Suchen Sie den Teilstring mit der maximalen Länge, bis das letzte Element von s durchlaufen ist.

代码

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        # 获取字符串s的长度
        n = len(s)
        # 如果字符串长度为0或1,直接返回n
        if n == 0 or n == 1:
            return n
        # 接着讨论字符串长度大于1的情况
        # 定义临时子字符串与子字符串储存列表
        sub_s, res = '', []
        # 开始遍历字符串s
        for i in range(n):
            # 判断如果当前字符s[i]不在子字符串
            # sub_s中, 便把当前字符s[i]添加到sub_s中
            if s[i] not in sub_s:
                sub_s = sub_s + s[i]
                # 此处多加一个判断, 当遍历到s最后一个元素
                #仍无重复字符, 将该子字符串添加到子字符串res中
                if i == n - 1:
                    res.append(sub_s)
            # 当前字符s[i]已存在于子字符串sub_s中
            else:
                # 先将当前子字符串sub_s存入res
                res.append(sub_s)
                # 在sub_s中找到与s[i]相同元素的索引
                ind = sub_s.index(s[i])
                # 取sub_s中相同元素之后的部分, 便去掉了重复元素
                sub_s = sub_s[(ind+1):]
                # 添加当前元素,继续遍历循环, 直到最后一元素
                sub_s = sub_s + s[i]
        
        # print(res)
        # 找到无重复元素的最长子字符串, 并返回其长度
        length = 0
        for i in res:
            len_i = len(i)
            if len_i > length:
                length = len_i
        
        return length

运行结果

Fügen Sie hier eine Bildbeschreibung ein
Wir sehen, dass die zeitliche Komplexität immer noch möglich ist, die räumliche Komplexität jedoch größer ist, da die Res-Liste verwendet wird, die alle Teilzeichenfolgen speichert. Daher kann es weiter optimiert werden, anstatt alle Teilzeichenfolgen in res zu speichern und die Länge der Zeichenfolge beim Durchlaufen direkt mit der längsten zu vergleichen, sodass die Zeit weiter optimiert werden kann und die Raumkomplexität verringert wird.

Ich denke du magst

Origin blog.csdn.net/Just_do_myself/article/details/118382695
Empfohlen
Rangfolge