我需要优化此代码,基本上检查s1
中是否包含字符串s2
的每个字符,并考虑到双倍。
s1, s2 = list(s1), list(s2)
for s in s2:
if s in s1:
s1.remove(s)
else:
return False
return True
我对map
,迭代器和生成器做了一些研究,我确信其中一个或多个有一个解决方案,但是现在我很困惑和沮丧(我很新到python,只需几周),所以也许你可以帮我理解这种情况下最好的策略。谢谢!
答案 0 :(得分:3)
使用Counter
正确处理重复字符的解决方案:
from collections import Counter
c1 = Counter(s1)
c2 = Counter(s2)
return all(c2[c]>=c1[c] for c in c1)
答案 1 :(得分:1)
您可以计算两个字符串中每个字符的出现次数。您也不需要将任何一个字符串作为列表:字符串是它们自己的迭代器。
首先,创建set
,因为集合的平均查找次数为O(1)
。
然后,遍历集合并获取每个字符的计数。如果任何计数不相等,return False
。随着字符串大小的增长,它也会比当前的解决方案更好地扩展:
s1 = 'Stack Overflow'
s2 = 'woltk fcrSeavO'
def equal_chars(s1, s2):
chars = set(s2)
for char in chars:
if s1.count(char)!= s2.count(char):
return False
return True
print(equal_chars(s1, s2))
答案 2 :(得分:0)
稍微调整一下阿德里安的优秀答案(可能?)效率更高:
from collections import Counter
s1 = "hello"
s2 = "helo"
def count_chars(s1,s2):
c2 = Counter(s2)
for k,v in Counter(s1).items():
if c2[k] < v:
return False
return True
print (count_chars(s1,s2))
结果:
False