Number 3

https://leetcode.com/problems/longest-substring-without-repeating-characters/

[14]:
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        i1 = 0
        s_list = list(s)

        len_s = len(s_list)
        max_string_size = 0

        for i1 in range(len_s):
            print(i1)
            char_list = [] # check if character already in list
            for i2 in range(i1, len_s):
                cur_char = s_list[i2]
                if cur_char not in char_list:
                    char_list.append(cur_char)
                else:
                    # Time to recalculate
                    break
            cur_string_size = len(char_list)
            max_string_size = cur_string_size if cur_string_size > max_string_size else max_string_size

        return max_string_size
[15]:
s = Solution()
s.lengthOfLongestSubstring("abhiram")
0
1
2
3
4
5
6
[15]:
6

Let’s see if this can be faster

Update - This actually threw a TLE on a really long input. Fail. ⛔️

[16]:
class Solution2:
    def lengthOfLongestSubstring2(self, s: str) -> int:
        i1 = 0
        s_list = list(s)

        len_s = len(s_list)
        max_string_size = 0

        for i1 in range(len_s):
            for i2 in range(len_s, i1-1,-1):
                cur_word = s_list[i1:i2]
                len_set = len(set(cur_word))
                len_list = len((cur_word))
                if len_set < len_list:
                    pass
                else:
                    cur_string_size = len(cur_word)
                    max_string_size = cur_string_size if cur_string_size > max_string_size else max_string_size
                    break

        return max_string_size
[17]:
s = Solution2()
s.lengthOfLongestSubstring2("abhiram")
[17]:
6

Same double pointer trick, but this time start from the reverse

[18]:
class Solution3:
    def lengthOfLongestSubstring3(self, s: str) -> int:
        i1 = 0
        s_list = list(s)

        len_s = len(s_list)
        max_string_size = 0

        for i1 in range(len_s):
            char_list = [] # check if character already in list
            if max_string_size > len_s - i1:
                break
            for i2 in range(i1, len_s):
                cur_char = s_list[i2]
                if cur_char not in char_list:
                    char_list.append(cur_char)
                else:
                    # Time to recalculate
                    break
            cur_string_size = len(char_list)
            max_string_size = cur_string_size if cur_string_size > max_string_size else max_string_size


        return max_string_size
[19]:
s = Solution3()
s.lengthOfLongestSubstring3("abhiram")
[19]:
6
[20]:
class Solution4:
    def lengthOfLongestSubstring4(self, s: str) -> int:
        i1 = 0
        s_list = list(s)

        len_s = len(s_list)
        max_string_size = 0

        for i1 in range(len_s):
            char_list = [] # check if character already in list
            char_list2 = []
            if max_string_size > len_s - i1:
                return max_string_size
            for i2 in range(i1, len_s):
                cur_char = s_list[i2]
                if cur_char not in char_list:
                    char_list.append(cur_char)
                else:
                    # Time to recalculate
                    break
            for i3 in range(i1+1, len_s):
                cur_char = s_list[i3]
                if cur_char not in char_list2:
                    char_list2.append(cur_char)
                else:
                    # Time to recalculate
                    break
            i1 = i1+1
            cur_string_size = len(char_list)
            cur_string_size2 = len(char_list2)
            max_string_size = max(max_string_size,cur_string_size,cur_string_size2 )


        return max_string_size

s = Solution4()
s.lengthOfLongestSubstring4("abhiram")
[20]:
6