Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成长度不超过10^5的字符串的回文字谜_Python_Chr_Ord - Fatal编程技术网

Python 生成长度不超过10^5的字符串的回文字谜

Python 生成长度不超过10^5的字符串的回文字谜,python,chr,ord,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)):

我尝试了以下内容,但尝试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
这实际上是我的解决方案。如何减少其执行时间并使其在长度为10^5的字符串中快速运行


谢谢。

当然,尝试所有组合都不够快。有一种简单得多的方法。它基于以下观察:假设
count[c]
是给定字符串中
c
的出现次数。当且仅当奇数值为
count
的字符数小于或等于1时,答案为是。这个观察给出了一个非常简单的
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")
count[c]=0表示字符串中出现的每个字符c
对于i=1…长度:
计数[s[i]]+=1
奇数计数=0时
对于每个c:
如果计数[c]%2==1:
奇数计数+=1时

如果你有没有考虑过使用
itertools
?@jornsharpe我试图实现我自己的排列方法,而不是使用内置的。我想提高我的编码技能。:)但是你要问的是如何让它更快——使用内置代码(大部分是用C编写的)会比你自己的代码更快。此外,递归在执行中并不总是有效的(尽管它可以使复杂的问题更容易推理)。@jornsharpe我使用了
itertools
,让我向你保证,当字符串甚至是12个字符长时,它需要很长的时间(找出所有的排列需要10分钟以上)。当然,找出所有的排列并不是一种有效的方法——不管你是否使用内置的方法!如果计数是偶数怎么办?@MohammadAreebSiddiqui计数的偶数字符数并不重要。
计数为奇数的字符数
。。“我不明白。”MohammadAreebSiddiqui对于每个字符
c
,我们已经计算了
count[c]
的值。它意味着字符的数量,例如
count[c]%2==1
。它总是打印出NO。