[ 算法题 ]


计算重复字符串的数量(移动窗口)

示例 1:

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

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

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:

        set_str = set()
        length = len(s)

        start_index = -1
        max_length = 0
        for i in range(length):
            if i != 0:
                set_str.remove(s[i-1])

            while start_index + 1 < length and s[start_index + 1] not in set_str:
                set_str.add(s[start_index + 1])
                start_index += 1

            max_length = max(start_index - i + 1, max_length)
            print(set_str)
            return 
        return max_length


        # # 哈希集合,记录每个字符是否出现过
        # occ = set()
        # n = len(s)
        # # 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
        # rk, ans = -1, 0
        # for i in range(n):
        #     if i != 0:
        #         # 左指针向右移动一格,移除一个字符
        #         occ.remove(s[i - 1])
        #     while rk + 1 < n and s[rk + 1] not in occ:
        #         # 不断地移动右指针
        #         occ.add(s[rk + 1])
        #         rk += 1

        #     # 第 i 到 rk 个字符是一个极长的无重复字符子串
        #     ans = max(ans, rk - i + 1)
        #     print(occ)
        # return ans


s = Solution()
print(s.lengthOfLongestSubstring("sadfghjkss"))