1、题目描述
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
示例 1:
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
2、初始思路
2.1 思路
前后指针同时进行寻找
2.2 犯错点
需要根据p的长度创建指针,超出时间限制
3 优化算法
3.1 思路
使用collections.Counter进行技术操作,创建滑动窗口进行求解。
from collections import Counter
class Solution(object):
def findAnagrams(self, s, p):
"""
:type s: str
:type p: str
:rtype: List[int]
"""
ls = len(s)
lp = len(p)
count_p = Counter(p)
count_s = Counter(s[:lp-1])
result = []
if ls < lp:
return result
for i in range(lp-1,ls):
count_s[s[i]] += 1
if count_p == count_s:
result.append(i-lp+1)
count_s[s[i-lp+1]] -= 1
if count_s[s[i-lp+1]] == 0:
del count_s[s[i-lp+1]]
return result
4 总结--Counter
collections.Counter 是 Python 标准库中的一个类,用于计数可哈希对象(通常是字符串中的字符)。它是一个字典的子类,其中元素作为键,它们的计数作为值。
4.1 创建Counter
(1)从可迭代对象进行创建
from collections import Counter
c = Counter('abracadabra')
print(c) # 输出: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
(2)从字典创建
c = Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
print(c) # 输出: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
(3)直接使用关键字参数进行创建
c = Counter(a=5, b=2, r=2, c=1, d=1)
print(c) # 输出: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
4.2 Counter的使用
(1)elements():返回一个迭代器,每个元素重复其计数的次数
c = Counter(a=4, b=2, c=1)
print(list(c.elements())) # 输出: ['a', 'a', 'a', 'a', 'b', 'b', 'c']
(2)most_common([n]):返回一个列表,内容为最常见的n个元素及其计数,按技术从高到低进行排序,如果n不指定,则输出所有元素。
c = Counter('abracadabra')
print(c.most_common(3)) # 输出: [('a', 5), ('b', 2), ('r', 2)]
(3)subtract([iterable-or-mapping]):从一个可迭代对象或另一个映射(或计数器)中减去元素的计数。
c = Counter(a=4, b=2, c=1)
c.subtract({'a': 2, 'b': 1})
print(c) # 输出: Counter({'a': 2, 'b': 1, 'c': 1})
(4)update([iterable-or-mapping]):增加元素的计数,类似于字典的 update 方法。
c = Counter(a=4, b=2, c=1)
c.update({'a': 2, 'b': 1})
print(c) # 输出: Counter({'a': 6, 'b': 3, 'c': 1})
(5)访问和修改计数:你可以像访问字典一样访问和修改 Counter 中的计数。
c = Counter(a=4, b=2, c=1)
print(c['a']) # 输出: 4
c['a'] += 1
print(c['a']) # 输出: 5
(6)删除元素:如果某个元素的计数变为 0,它不会从 Counter 中删除。你可以手动删除它。
c = Counter(a=4, b=2, c=1)
del c['a']
print(c) # 输出: Counter({'b': 2, 'c': 1})
标签:count,输出,计数,异位,Counter,print,leetcode100,lp,字符串
From: https://blog.csdn.net/qq_65509025/article/details/144009062