生成长度达10 ^ 5的字符串的回文字符

时间:2014-11-07 14:19:25

标签: python chr ord

我尝试过以下操作但是当我尝试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的字符串快速运行?

感谢。

1 个答案:

答案 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")