LeetCode (力销) 03 pregunta: La subcadena más larga sin caracteres repetidos----solución iterativa de ventana deslizante con notas detalladas

题目描述

Dada una cadena, encuentre la longitud de la subcadena más larga que no contiene caracteres repetidos y devuelva su longitud.

示例

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

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

输入: s = ""
输出: 0

思路

El título es para permitirnos encontrar la subcadena más larga que no contiene elementos repetidos, luego un recorrido es suficiente, siempre que se encuentre un elemento repetido, tomaremos directamente la parte posterior al elemento repetido de la subcadena actual y continuaremos atravesando hacia atrás, y finalmente seleccione la subcadena más larga Just string. Por ejemplo, s = 'abcabc', asumiendo que hemos viajado a la primera 'c', entonces la subcadena actual es 'abc', y el siguiente elemento es 'a', se puede ver que 'a' ya existe en el subcadena actual 'abc' , eliminaremos los elementos repetidos, tomaremos 'bc' (eliminaremos 'a') en la subcadena actual y luego continuaremos hacia abajo. Hasta que se atraviese el último elemento de s, encuentre la subcadena con la longitud máxima.

代码

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

运行结果

inserte la descripción de la imagen aquí
Vemos que la complejidad del tiempo todavía es posible, pero la complejidad del espacio es mayor porque se usa la lista res que almacena todas las subcadenas. Por lo tanto, se puede optimizar aún más, en lugar de almacenar todas las subcadenas en res, y comparar directamente la longitud de la cadena con la más larga al atravesar, de modo que se pueda optimizar aún más el tiempo y se reduzca la complejidad del espacio.

Supongo que te gusta

Origin blog.csdn.net/Just_do_myself/article/details/118382695
Recomendado
Clasificación