我尝试过以下操作但是当我尝试17个字符的字符串时需要花费太多时间。
string = input()
def permute(xs, low=0):
if low + 1 >= len(xs):
yield xs
else:
for p in permute(xs, low + 1):
yield p
for i in range(low + 1, len(xs)):
xs[low], xs[i] = xs[i], xs[low]
for p in permute(xs, low + 1):
yield p
xs[low], xs[i] = xs[i], xs[low]
for p in permute(list(string)):
mstr = "".join(p)
if mstr == mstr[::-1]:
print("YES")
break
这实际上是我对'Game of Thrones' challenge on hackerrank的解决方案。如何减少执行时间并使其对于长度为10 ^ 5的字符串快速运行?
感谢。
答案 0 :(得分:1)
当然,尝试所有组合都不够快。有一种更简单的方法可以做到这一点。它基于以下观察:我们假设count[c]
是给定字符串中c
的出现次数。然后,当且仅当奇数值为count
的字符数小于或等于1时,答案为YES。此观察提供了一个非常简单的O(N)
解决方案。
这是一个伪代码:
count[c] = 0 for each character c that appears in the string
for i = 1...length(s):
count[s[i]] += 1
with_odd_count = 0
for each c:
if count[c] % 2 == 1:
with_odd_count += 1
if with_odd_count <= 1:
print("YES")
else:
print("NO")