Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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 计算可以从字符串生成的唯一字符串的数量_Python_String - Fatal编程技术网

Python 计算可以从字符串生成的唯一字符串的数量

Python 计算可以从字符串生成的唯一字符串的数量,python,string,Python,String,如果我有一个字符串(例如“AABC”),如何计算可能的唯一字符串的数量 在这种情况下,答案是12,但我如何用算法计算呢 我可以为ABC做这件事,但是重复的角色让我困惑 我正试图用Python来做这件事 编辑:另外,我不想生成所有可能的字符串,只想计算数字。您可以使用itertools模块来完成 打开python解释器 import itertools for unique in itertools.permutations("AABC"): print "".join(unique)

如果我有一个字符串(例如“AABC”),如何计算可能的唯一字符串的数量

在这种情况下,答案是12,但我如何用算法计算呢

我可以为ABC做这件事,但是重复的角色让我困惑

我正试图用Python来做这件事


编辑:另外,我不想生成所有可能的字符串,只想计算数字。

您可以使用itertools模块来完成

打开python解释器

import itertools
for unique in itertools.permutations("AABC"):
    print "".join(unique)

只需根据需要更改“AABC”。

您可以遍历所有排列,并使用itertools模块计算唯一的排列

import itertools

string = "AABC"
count = len(set(itertools.permutations(string)))
print(count)
但是,由于您只需要计数,因此可以更轻松地进行:

import math
import collections

string = "AABC"

chars = collections.Counter(string)
denominator = reduce(lambda x,y: x * math.factorial(y), chars.values(), 1)
count = math.factorial(len(string)) / denominator
print(count)

看一看,我认为这些都不适用。我尝试了一些,并给出了“AABC”,它将生成多个相同的字符串。您没有注意到问题标题中的单词unique。提示
集合的主要属性是什么?它的元素是独一无二的。如何从iterable创建
集合
<代码>设置(可编辑)
集合
是可编辑的吗?哦,是的。谢谢,但是对于大字符串,当只需要计数时,这将非常耗时。linus把它钉在上面了。嘿,谢谢gbofi,我刚刚注意到输出字符串不是唯一的。@bleurhgarator-是的,对于大字符串,这将消耗大量时间,是的,linus真的钉住了它/更容易/更有效/哇,这非常令人印象深刻,而且似乎是正确的,通过谷歌搜索,我相信这与二项式系数有关,但维基百科的文章远远超出了我的理解范围。用外行的话来说,你能解释一下吗?假设你有n个唯一的项目(在这个例子中是字母表),你想计算你可以排列它们的方式总数。有n种方法选择第一个项目作为安排,然后(n-1)种方法选择第二个,然后(n-2)种方法选择第三个,依此类推。因此,总安排数变为n*(n-1)*(n-2)*……*1.或者换句话说,n!。现在假设其中一些项目是重复的。在OP的示例中,有两个As。按照与上面相同的逻辑,有2个!将这两种方式安排为,但它们将生成重复安排。因此,你将以“AABC”和“AACB”重复2结尾!时代。只需除以2!以获得独特的安排。一般来说,如果n个项目包含一种类型的n1个项目,另一种类型的n2个项目,等等,则唯一排列的数量为n/(n1!*n2!…)谢谢李纳斯,这是一个很好的回答和解释,如果我能让StackOverflow直接向你分发啤酒,我会的,但你必须接受一个公认的答案!:-)