当前位置:   article > 正文

【Leetcode】top 100 滑动窗口

【Leetcode】top 100 滑动窗口
3 无重复字符的最长子串

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

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

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

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

  1. class Solution(object):
  2. def lengthOfLongestSubstring(self, s):
  3. """
  4. :type s: str
  5. :rtype: int
  6. """
  7. maxlen, length, idx = 0, 0, 0 #idx为上界的下标
  8. tmp = {}
  9. for i, val in enumerate(s):
  10. if val in tmp and tmp[val] >= idx: #出现重复
  11. idx = tmp[val] + 1
  12. maxlen = max(maxlen, length)
  13. length = i - tmp[val]
  14. tmp[val] = i
  15. else:
  16. length += 1
  17. tmp[val] = i
  18. 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),而不是每次循环的时候都重复计算;

  1. class Solution(object):
  2. def findAnagrams(self, s, p):
  3. """
  4. :type s: str
  5. :type p: str
  6. :rtype: List[int]
  7. """
  8. p = sorted(p)
  9. return [i for i in range(len(s)-len(p)+1) if sorted(s[i:i+len(p)]) == p]
  10. #用时击败5.69%用户...继续优化

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

  1. class Solution(object):
  2. def findAnagrams(self, s, p):
  3. """
  4. :type s: str
  5. :type p: str
  6. :rtype: List[int]
  7. """
  8. out = []
  9. lens, lenp = len(s), len(p)
  10. if lens < lenp: return out
  11. listp = [0 for _ in range(26)]
  12. lists = [0 for _ in range(26)]
  13. for i in range(lenp):
  14. listp[ord(p[i])-ord('a')] += 1
  15. lists[ord(s[i])-ord('a')] += 1
  16. for i in range(lens-lenp+1):
  17. if i > 0:
  18. lists[ord(s[i-1])-ord('a')] -= 1
  19. lists[ord(s[i+lenp-1])-ord('a')] += 1
  20. if lists == listp:
  21. out.append(i)
  22. return out
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/209336?site
推荐阅读
相关标签
  

闽ICP备14008679号