赞
踩
给定一个字符串 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)
给定两个字符串 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。