每日一练2020/8/7(python)——给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

子串(substirng):串中任意个连续字符组成的子序列称为该串的子串
如:"pwwkew"的无重复子串为:“pw” “wke” “kew” “p” "w"等

方法一:暴力破解

遍历并找出所有无重复的最长连续子串
缺点:时间复杂度、空间复杂度都很高

def lengthOfLongestSubstring(s):
		if not s:
        	return 0
        substirng = {}
        for i in range(len(s)): # 遍历字符串,找到所有的substring
            temp_str = s[i]
            for j in range(i + 1, len(s)): 
                if s[j] not in temp_str: # 如果不重复,指针右移
                    temp_str = s[i : j + 1]
                elif s[j] in temp_str:
                    substirng[temp_str] = len(temp_str) # 如果有重复,清空,退出循环
                    temp_str = ""
                    break
                substirng[temp_str] = len(temp_str)
            else:substirng[temp_str] = len(temp_str)
        print(substirng)
        max = 0
        for x in substirng.values():
            if x > max:
                max = x
        return max

上一种方法的改进, 基本没变什么,把max的遍历放进了前面

        # lst = []
        # max_len = 0
        # for i in range(len(s)):
        #     lst.append(s[i])
        #     for j in range(i + 1, len(s)):
        #         if s[j] not in lst:
        #             lst.append(s[j])
        #         elif s[j] in lst:
        #             max_len = max(len(lst), max_len) 
        #             lst = []
        #             break        
        #     else:
        #         max_len = max(max_len, len(lst))
        #         lst = []        
        # return max_len

方法二:滑动窗口法
如:abcadsfd:窗口到(abc)adsfd时,遇到a,窗口右移(abc)adsfd -> a(bca)dsfd
记录每个窗口的长度,大的放入max里。

def lengthOfLongestSubstring2(s):
    if not s:
        return 0
    lst = [] # 滑动窗口
    max_len = 0
    for x in s:
        if x not in lst: # 如果字符不在滑动窗口中,则直接扩展放入
        else:
            max_len = max(len(lst), max_len)
            lst.append(x)
            lst = lst[lst.index(x) + 1: ] # 发现重复,从重复的右边开始计算
        max_len = max(len(lst), max_len)
     
    return max_len

方法三:双指针法

	#如果字符不在滑动窗口中,则直接扩展窗口
    # 如果字符在滑动窗口中,则
    # 1. 从窗口中移除重复字符及之前的字符串部分
    # 2. 再扩展窗口
    # 在滑动窗口范围内中找出对应的首个字符的索引X,对应的新的左指针位置为X + 1
    # 左指针右移 索引X增一 位
def lengthOfLongestSubstring3(s):
    # 字符串为空则返回零
    if not s:
        return 0
    max_length = 0      # 滑动窗口数组
    left, right = 0, 0  # 双指针
    for c in s:
        if c not in s[left:right]:
            # 右指针右移一位
            right += 1
        else:
            left += s[left:right].index(c) + 1 #只要是在滑动窗口内找索引,就不用担心三个以上的相同元素了
            # 右指针右移一位
            right += 1        
        max_length = max(right - left, max_length) # 更新最大长度
    # 如果最大长度不为零,返回最大长度
    # 如果最大长度仍为零,则说明遍历整个字符串都没有发现重复字符,最大长度即为字符串本身的长度
    return max_length if max_length != 0 else len(s)

你可能感兴趣的:(每日一练)