<p>你的代码效率不高,不,因为你在一个双循环中迭代。对于<code>s1</code>中的每个字母,在最坏的情况下(没有匹配项),您将遍历所有的{<cd2>}。在</p>
<p>请改用<a href="https://docs.python.org/3/library/collections.html#collections.Counter" rel="nofollow noreferrer">^{<cd3>} object</a>;它们充当<em>多集</em>,在这里您既可以测试O(1)时间内是否存在字符,也可以管理剩余的计数:</p>
<pre><code>from collections import Counter
def contains(s1, s2):
s2set = Counter(s2)
for c in s1:
count = s2set[c]
if not c:
return False
if count == 1:
del s2set[c]
else:
s2set[c] = count - 1
return True
</code></pre>
<p>您还可以将<code>s1</code>转换为多集,并检查<code>s2</code>的多集是否包含足够的字母来表示每个条目:</p>
^{pr2}$
<p>后者可以使用<a href="https://docs.python.org/3/library/functions.html#all" rel="nofollow noreferrer">^{<cd6>} function</a>进一步减少,如果传递的结果是<code>False</code>,则返回{<cd7>},否则返回{<cd9>},否则:</p>
<pre><code>def contains(s1, s2):
s2set = Counter(s2)
return all(count <= s2set[c] for c, count in Counter(s1).items())
</code></pre>
<p>在所有这些中,您只需在<code>s1</code>和<code>s2</code><em>上迭代一次</em>(直接或生成多集)。在</p>
<p>后者演示:</p>
<pre><code>>>> from collections import Counter
>>> def contains(s1, s2):
... s2set = Counter(s2)
... return all(count <= s2set[c] for c, count in Counter(s1).items())
...
>>> s1 = 'hypochondriac'
>>> s2 = 'yqhpwoewnqlchpijcdrxpoa'
>>> contains(s1, s2)
True
>>> contains(s1 + 'b', s2)
False
</code></pre>