zoukankan      html  css  js  c++  java
  • 【python-leetcode03-滑动窗口法】无重复字符的最大子串

    问题描述:

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

    示例 1:

    输入: "abcabcbb"
    输出: 3
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    示例 2:

    输入: "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    示例 3:

    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
    请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

    按照惯例,首先是我们的简单版滑动窗口法:

    class Solution:
        def lengthOfLongestSubstring(self, s: str) -> int:
            tmp = 0 #用于记录满足条件得最大值
            for i in range(1,len(s)+1):#步长从1到len(s)+1
                for j in range(len(s)-i+1):#窗口左端
                    if len(set(s[j:j+i])) == len(s[j:j+i]):#如果取集合后的长度和原始窗口长度一样,说明这个窗口是不含重复字符的
                        tmp = max(tmp,i)#更新tmp的值
            return tmp #最后返回即可

    看下结果,依旧超时,不过呢:

    只有一个用例没通过,如果想要把题目做出来,简单版的滑动窗口,简单粗暴。

    要想通过就得使用升级版的滑动窗口了:一个左边界start,一个记录最大值max_num,一个记录当前遍历得子串hash。从左开始遍历数组,先将其加入到hash中,接下来如何判断是否出现了重复得字符呢?想了有点久,想到一种巧妙得办法,如果hash表中得键得长度小于hash表中值得和,说明出现了重复的字符,此时左边界就起作用了,让左边界对应的字符在hash中的值减一,如果还有重复的,start+=1,在执行减一操作,如果该字符值变为0,就将其删除,直到hash表中的键的长度等于值得和,此时记录下当前符合的最大值。

    class Solution:
        def lengthOfLongestSubstring(self, s: str) -> int:
            if len(s) == 0:
                return 0
            if len(s) == 1:
                return 1
            start = 0  # 滑动窗口左端
            max_num = 0  # 用于计算最大值
            from collections import defaultdict
            hash = defaultdict(int)  
            for i in range(len(s)):
                hash[s[i]]+=1
                while len(hash)<self.dictSum(hash):
                    hash[s[start]] -= 1
                    if hash[s[start]] == 0:
                        del hash[s[start]]
                    start += 1
                max_num = max(max_num,i-start+1)
            return max_num
        def dictSum(self,dic):
            sum = 0
            for i in dic:
                sum += dic[i]
            return sum

    结果:

    虽然有点惨,但好歹先把它做出来了。 

  • 相关阅读:
    0-Android系统各层中LOG的使用
    Android系统进程Zygote启动过程的源代码分析
    Android应用程序的Activity启动过程简要介绍和学习计划
    分享一个监测企业微信群人员变化的脚本...
    C++ 之 stl::string 写时拷贝导致的问题
    分享一个批量修改文件编码的python脚本
    分享stl sort函数坑点导致coredump问题
    关于使用repo时repo init和repo sync失败的一个解决方案
    sourceinsight sublimetext主题色配置
    父子进程之间的数据拷贝关系
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12293235.html
Copyright © 2011-2022 走看看