无重复字符的最长子串 Counter() & sorted() & jion() == Dictionary (get)

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

3. 无重复字符的最长子串

一、使用Counter()

# 使用哈希表count来记录字符出现的次数,用于判断是否出现重复字符。
# 使用left和right两个指针分别表示当前无重复子串的左边界和右边界,初始都指向字符串的开头。
# 遍历字符串s,对于每个字符x:
#     将该字符出现次数加1,表示在当前子串中添加了这个字符。
#     如果字符x的出现次数超过1(即当前子串中有重复字符),则需要缩小子串的左边界,直到子串中没有重复字符为止。
#     更新最长无重复子串的长度res,即res = max(res, right - left + 1)。


class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        count = Counter()
        left, res = 0, 0
        for right, x in enumerate(s):
            count[x] += 1
            while count[x] > 1:
                # 更新左边界
                count[s[left]] -= 1
                left += 1
            res = max(res, right-left+1)

        return res

collections模块 ==>Python标准库,数据结构常用的模块;collections包含了一些特殊的容器,针对Python内置的容器,例如list、dict、set和tuple,提供了另一种选择。

Counter()

主要功能:可以支持方便、快速的计数,将元素数量统计,然后计数并返回一个字典键为元素,值为元素个数。【与字典的不同之处? ↓↓↓ most_common()、elements()、update()、subtract()】
Python collections模块之Counter()详解

list1 = ["a", "a", "a", "b", "c", "c", "f", "g", "g", "g", "f"]
dic = Counter(list1)
print(dic)
# 结果:次数是从高到低的
# Counter({'a': 3, 'g': 3, 'c': 2, 'f': 2, 'b': 1})
 
print(sorted(dic.items(), key=lambda s: (-s[1])))
# 结果:按统计次数降序排序
# [('a', 3), ('g', 3), ('c', 2), ('f', 2), ('b', 1)]
#	dic.items()将字典dic转换为一个由键值对组成的元组列表,然后sorted函数对这个元组列表进行排序。
#	排序的规则由key参数指定,其中lambda s: (-s[1])是一个lambda函数,
#	它表示按照元组的第二个元素(也就是字典的值)进行降序排序。

Python sorted() 函数
Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。

二、使用字典

Python 字典(Dictionary) get()方法

get() 函数返回指定键的值, 如果键不在字典中返回默认值 None 或者设置的默认值。
get()方法语法:dict.get(key[, value])
· key – 字典中要查找的键。
· value – 可选,如果指定键的值不存在时,返回该默认值。

Python 字典(Dictionary)

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        dic = {}    # 记录(key)出现的次数(value)
        left, res = 0, 0
        for right, value in enumerate(s):
            dic[s[right]] = dic.get(s[right], 0) + 1

            if right-left+1 == len(dic):
                res = max(right-left+1, res)
            
            while right-left+1 > len(dic):
                # 左指针右移
                head = left
                dic[s[head]] -= 1
                if dic[s[head]] == 0:
                    del dic[s[head]]
                left += 1
        return res

[滑动窗口真滴简单!] 闪电五连鞭带你秒杀12道中档题 (附详情解析)

你可能感兴趣的:(python,python)