LeetCode (力销) 03 の質問: 繰り返し文字を含まない最長の部分文字列 -- 詳細なメモ付きのスライディング ウィンドウ反復ソリューション

题目描述

文字列を指定して、繰り返し文字を含まない最長の部分文字列の長さを見つけて、その長さを返します。

示例

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

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

输入: s = ""
输出: 0

思路

タイトルは、繰り返し要素を含まない最長の部分文字列を見つけさせます。その後、1 回の走査で十分です。繰り返し要素が見つかった限り、現在の部分文字列の繰り返し要素の後の部分を直接取得し、走査を続けます。後方に移動し、最後に最長の部分文字列 Just string を選択します。たとえば、s = 'abcabc'、最初の 'c' まで移動し、現在の部分文字列が 'abc'、次の要素が 'a' であると仮定すると、'a' がすでに存在していることがわかります。現在の部分文字列 'abc' から、繰り返されている要素を削除し、現在の部分文字列から 'bc' を取得 ('a' を削除) して、下方向へのトラバースを続けます。s の最後の要素が探索されるまで、最大長の部分文字列を見つけます。

代码

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

运行结果

ここに画像の説明を挿入
時間計算量は依然として可能ですが、すべての部分文字列を格納する res リストが使用されるため、空間計算量は大きくなることがわかります。したがって、すべての部分文字列を res に保存する代わりに、さらに最適化することができ、トラバース時に文字列の長さを直接比較して最長のものを見つけることで、時間をさらに最適化し、空間の複雑さを軽減できます。

おすすめ

転載: blog.csdn.net/Just_do_myself/article/details/118382695