??3. 无重复字符的最长子串
思路:
1.哈希+滑动窗口
2.先将列表的第一位加入集合,随后进行循环,条件是右指针未到最后一位
3.循环期间进行下次循环,如果下一位并未在集合中出现,则右指针右移并将所指数字加入集合
4.如果下一个出现在了集合中,结束内层循环,取右边左边长度差值和当前答案的最大值作为新的答案
5.删除左端指针所指元素,左指针右移一位,右指针不变
代码:(直接放标答吧注释很全)
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 哈希集合,记录每个字符是否出现过occ = set()n = len(s)# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动rk, ans = -1, 0for i in range(n):if i != 0:# 左指针向右移动一格,移除一个字符occ.remove(s[i - 1])while rk + 1 < n and s[rk + 1] not in occ:# 不断地移动右指针occ.add(s[rk + 1])rk += 1# 第 i 到 rk 个字符是一个极长的无重复字符子串ans = max(ans, rk - i + 1)return ans
567.字符串的排列
思路:
1.和上题类似,先用collections.Counter()来计算第一个字符串的字符和出现次数和第二个字符串相应长度的从头开始的字符和出现次数,返回两个字典
2.用滑动窗口来统计s2中的字符,床口长度始终等于s1长度,每次滑动时,删除上一个元素,并加入下一个元素
3.每次滑动时执行一次判断,当两个字典相同的时候判断为True
4.如果直到窗口循环到结尾都没能找到,那么返回False
5.值得一提的是,这题不能用集合代替字典,原因是如果存在多个相同的字符连续出现在s1里时,由于唯一性,集合将不能正确的表达s2,所以需要选择一个有无序性且可以统计数量的结构,即字典。
代码:
class Solution:def checkInclusion(self, s1: str, s2: str) -> bool:l = 0r = len(s1) - 1n = len(s2)dict1,dict2 = collections.Counter(s1),collections.Counter(s2[l:r+1])while r < n:if dict1 == dict2:return Truedict2[s2[l]] -= 1if r + 1 < n:dict2[s2[r + 1]] += 1# print(dict1,dict2)l += 1r += 1return False
以上
坚持 共勉