3. Longest Substring Without Repeating Characters

問題:Given a string s, find the length of the longest substring without repeating characters.

Input: s = "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.


文字列の中から、連続する文字列で重複がない最長の長さを求めよという問題。
チェックする文字列の最初と最後をi, jとして前探索すると、O(N^2)になってします。

以下の様な文字列があった場合、二個目のbで重複が見つかります。そしたら、一個目のbの次まで、重複リストから外しながら検索していき、次の文字列のスタート位置を一個目のbの次の文字に設定します。
f:id:poohandduffy:20200911062452p:plain
こうすると、N-2N計算量になります。

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        ans = 1
        n = len(s)
        temp = 1
        if n == 0 or n == 1:
            return n
        start=0
        check = set(s[0])
        for i in range(1, n):
            if s[i] in check:
                ans = max(ans, temp)
                for j in range(start, i):
                    if s[j] != s[i]:
                        check.remove(s[j])
                    else:
                        start = j + 1
                        temp = i - j
                        break
                check.add(s[i])
            elif i == n - 1:
                temp += 1
                ans = max(ans, temp)
            else:
                temp += 1
                check.add(s[i])
        return ans