【Leetcode】top 100 滑动窗口

3 无重复字符的最长子串

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

分析:因为要判断重复字符,想到用哈希表查找会更快,但问题在于出现重复字符时,怎么更新哈希表,去除前一重复字符之前的所有元素...我的做法是没动哈希表但设置了一个上界值,超出上界值(即位于前一重复字符之前的所有元素)的查重无效;

思路:遍历字符,当字符在哈希表中不能查到时,插入该字符和对应下标,当前长度值;

                             当字符在哈希表中查到时,判断该字符的前一重复字符是否超出上界,若超出,查重无效;若不超出,则需要更新上界值,最长长度值,当前长度值,然后更新该字符在哈希表中的下标;

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        maxlen, length, idx = 0, 0, 0   #idx为上界的下标
        tmp = {}
        for i, val in enumerate(s):
            if val in tmp and tmp[val] >= idx:   #出现重复
                idx = tmp[val] + 1  
                maxlen = max(maxlen, length)
                length = i - tmp[val]
                tmp[val] = i    
            else:
                length += 1
                tmp[val] = i
                
        return max(maxlen, length)
 438 找到字符串中所有字母异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

分析:对于相同长度的字符串怎么判断是不是异位词?

①重排序,所以截取s中和p相同长度的字符串然后排序判断是否相等就能得到输出;

②26位列表统计每个小写字符出现次数

思路一:一行代码:return [i for i in range(len(s)-len(p)+1) if sorted(s[i:i+len(p)]) == sorted(p)]

由于题目给出p.length<=3*10^4,所以选择申请额外空间记录sorted(p),而不是每次循环的时候都重复计算;

class Solution(object):
    def findAnagrams(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: List[int]
        """
        p = sorted(p)
        return [i for i in range(len(s)-len(p)+1) if sorted(s[i:i+len(p)]) == p]

#用时击败5.69%用户...继续优化

思路二:遍历p用listp表示其字母情况,在这里同时统计s[0:lenp]的字母情况(要求lens>=lenp)然后切换到对s的遍历,当当前下标非0时需要更新lists的字母情况(消去前一字母并添加新的字母)判断lists和listp是否相等即可;

class Solution(object):
    def findAnagrams(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: List[int]
        """
        out = []
        lens, lenp = len(s), len(p)
        if lens < lenp: return out

        listp = [0 for _ in range(26)]
        lists = [0 for _ in range(26)]
        for i in range(lenp):
            listp[ord(p[i])-ord('a')] += 1
            lists[ord(s[i])-ord('a')] += 1

        for i in range(lens-lenp+1):
            if i > 0:
                lists[ord(s[i-1])-ord('a')] -= 1
                lists[ord(s[i+lenp-1])-ord('a')] += 1
            if lists == listp:
                out.append(i)
        return out
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值