首页 > 其他分享 >最长无重复子串

最长无重复子串

时间:2024-08-16 17:04:29浏览次数:6  
标签:子串 count set 重复 max len right 最长 left

无重复字符的最长子串

这个问题两个思路,要么进行遍历暴力破解,要么进行滑动窗口(巧妙),下面先看一下暴力解法:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:

        s_count = len(s)

        max_list = []
        if s_count == 0:
            return 0
        else:
            # 两层的遍历 
            for i in range(s_count):
                tmp = s[i]
                max_list.append(tmp)
                for j in range(i+1, s_count):
                    tmp += s[j]
                    max_list.append(tmp)
            # 然后用set 判断子串是否有重复
            return max([len(i) for i in max_list if len(set(list(i))) == len(i)])

 

这个时间复杂度是N方,下面看一下滑动窗口的解法,我来一个left和right,然后用right遍历,如果有重复子串,我就删除left,知道没有重复为止,这个思路太可以了。

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:

        left = 0

        s_len = len(s)
        max_count = 0
        # 用set 来记录最长无重复子串
        max_set = set()
        # right 遍历 s
        for right in range(s_len):
            # 如果在set 中 我就删除左边的 直到没有重复为止
            while s[right] in max_set:
                max_set.remove(s[left])
                left += 1
            max_set.add(s[right])

            max_count = max(max_count, right - left + 1)
        return max_count

 

 滑动窗口的时间复杂度是O(N),提高不少。

 

标签:子串,count,set,重复,max,len,right,最长,left
From: https://www.cnblogs.com/TW-NLP/p/18363255

相关文章

  • 表现良好的最长时间段(LeetCode)
    题目给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。请你返回「表现良好......
  • Python实现最长回文字符串
    题目最长回文字符串是一种对称的字符串,如s="ababd",其中"aba"或"bab"都是回文字符串。求解思路最开始的思路是用类似括号匹配的放手,利用栈来做“对对消”,来判断一个字符串是不是回文字符串,但实际操作中发现“对称轴”元素是不确定的,前面的消除会导致后面的无法对比。然后......
  • 【动态规划】最长不下降子序列
    ​题目描述有长度为N的序列:A1A2…..An求最长不下降子序列:Ai1,Ai2,,,,,Aik,其中ai1<=ai2<=.....<=aik求最长不下降子序列的长度输入从文件 seq.in 中读入数据。第一行,n; 第二行,n个数。输出输出到文件 seq.out 中。最长不下降子序列的长度样例输入 复制11......
  • 3_无重复字符的最长子串
    3_无重复字符的最长子串【问题描述】给定一个字符串s,请你找出其中不含有重复字符最长子串的长度。示例:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。【算法设计思想】此题为典型的滑动窗口问题,这类问题的主要是处理数组或者字......
  • P2679 [NOIP2015 提高组] 子串
    https://www.luogu.com.cn/problem/P2679只能说是,超级好的一道例题[NOIP2015提高组]子串题目背景NOIP2015Day2T2题目描述有两个仅包含小写英文字母的字符串\(A\)和\(B\)。现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符......
  • laravel 批量插入并在遇到重复键时更新
    /***批量插入并在遇到重复键时更新*@paramarray$values*@returnbool*/publicstaticfunctioninsertOnDuplicate(array$values){if(empty($values)){returntrue;}if(!is_array(reset($values))){$values=[$values];......
  • Amazing-Py-Scripts:用Python代码脚本实现一键自动化,告别重复性工作,提升工作效率
    你是否厌倦了枯燥的重复性工作?是否渴望用代码创造出有趣的工具来提升效率?那么,Amazing-Python-Scripts将会成为你的秘密武器!这个GitHub仓库汇集了大量实用且有趣的Python脚本,涵盖从基础到高级,从自动化任务到娱乐应用,旨在帮助你轻松实现自动化、提高工作效率、并用代码点缀......
  • 【Leetcode 594 】 最长和谐子序列 —— 这是假的滑动窗口吧!
    和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。示......
  • 子串查找算法KMP
    什么是子串查找        字符串子串查找是一种在较长的字符串(通常称为"主串"或"文本")中寻找一个较短字符串(称为"模式串"或"子串")的过程。这是计算机科学中的一个基本问题,在文本编辑、信息检索、生物信息学等多个领域都有广泛应用。主要的子串查找算法包括:暴力匹配法(B......
  • LeetCode 3 无重复字符的最长子串
    题目描述给定一个字符串s,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:因为无重复字符的最长子串是"b",所以其长度......