[Leetcode]最长不重复子串


Given a string, find the length of the longest substring without repeating characters.
给定一个字符串,找到最长子字符串的长度而不重复字符。

一.穷举循环法

class Solution:
def lengthOfLongestSubstring(self, s):
    """
    :type s: str
    :rtype: int
    """
    max1=1
    n=0
    if s=="":
        max1=0
        return max1
    else:
        for i in s:
            n=n+1
            t=1

            p=n
            for j in s[n:]:

                if j in s[n-1:p]:
                    max1 = max(t, max1)
                    break

                else:
                    t=t+1
                    max1=max(t,max1)
                p=p+1
        return max1

两次循环
外循环:遍历字符串中每一个字符
内循环:遍历外循环字符串字符之后的每一个字符串,一旦发现和外循环字符重复,就退出内循环
每次内循环更新最长字串的值

二.滑动窗口法

class Solution:
def lengthOfLongestSubstring(self, s):
    """
    :type s: str
    :rtype: int
    """
    n=len(s)
    if s=="":
        return 0
    if n==1:
        return 1
    else:
        i=0
        j=1
        max1=1
        while (i<n and j<n):     
            if s[j] in s[i:j]:
                i=i+1
                j=i+1
            else:
                j=j+1
                max1=max(max1,(j-i))

        return max1

solution中给出了一种滑动窗口概念,在java中运用。
在窗口中存储当前数据:[i,j)j一开始等于i。
当j索引不在窗口里,窗口末端向后滑,并返回j-i
当j索引在窗口里,窗口前端向后滑
保证遍历每一个字符

运用到python中

和第一种方法的想法是完全一样的,但是算法不同,时间复杂度节省了很多
遍历每一个字符和子字符串 可以用滑动窗口的想法来遍历,而不需要用两个for循环

三.还有一种更简便的方法

看不懂了。。。。