<p>创建、计数和比较<code>Counter</code>对象的开销比列表的开销大。这就是你所看到的一切的本质。如果您还需要一个更快的方法,您可以通过将<code>p</code>的排列构建为一个元组,然后对照元组检查<code>s</code>的片段来完成anagram finder。在</p>
<pre><code>class Solution(object):
def findAnagrams(self, s, p):
"""
:type s: str
:type p: str
:rtype: List[int]
"""
ans = list()
pcnt = collections.Counter(p)
for i in range(len(s)):
if collections.Counter(s[i:i+len(p)]) == pcnt:
ans.append(i)
return ans
def findAnagrams2(self, s, p):
ls, lp = len(s), len(p)
cp = collections.Counter(p)
cs = collections.Counter()
ans = []
for i in range(ls):
cs[s[i]] += 1
if i >= lp:
cs[s[i - lp]] -= 1
if cs[s[i - lp]] == 0:
del cs[s[i - lp]]
if cs == cp:
ans.append(i - lp + 1)
return ans
def findAnagrams3(self, s, p):
p_all = tuple(''.join(x) for x in permutations(p,len(p)))
return [i for i in range(len(s)) if s[i:i+len(p)] in p_all]
</code></pre>
<p>下面是IPython中使用<code>timeit</code>的3种方法的简短比较:</p>
^{pr2}$