我已经创建了一个可以成功完成此操作的函数(我很确定),但是我担心其中的部分效率。我有两个嵌套for
循环,我认为这会使该算法在O(n ^ 2)附近最坏的情况。有什么办法可以改善这个状况?
def palindrome(string):
s = [c.replace(' ', '') for c in string]
merged = "".join(s)
srt = sorted(merged)
dic = {}
singles = 0
for i in srt:
if i not in dic:
dic[i] = 1
else:
# Worried about this second loop having to run for every i in srt
for key, value in dic.items():
if key == i:
dic[key] = 2
for key, value in dic.items():
if value == 1:
singles += 1
if singles > 1:
return False
else:
return True
您需要找出是否最多有一个“单”字母(其他字母是成对的)。因此,我们用计算字母,collections.Counter
并确保只有0或1个字母具有奇数:
from collections import Counter
def has_palindrome(string):
return sum(v % 2 for v in Counter(string).values()) <= 1
print(has_palindrome('abcabcc')) # True
print(has_palindrome('abc')) # False
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句