我正在使用cur.execute(sql, (age, gender, name, email, accuracy))
mysql.connection.commit()
模块中的permutations()
函数。我必须比较两个字符串。只要一个是另一个的排列,就可以认为这些字符串是相等的。
itertools
的文档说:
itertools.permutations()
返回迭代中元素的连续
itertools.permutations(iterable[, r])
长度排列。如果未指定r或
r
,则None
默认为可迭代的长度,并生成所有可能的全长排列。
这是我的代码:
r
但是生成import itertools
mystr = []
for i in range(0, 2):
mystr.append(input())
plist = itertools.permutations(mystr[0])
for i in plist:
print(i)
if any(x == mystr[1] for x in plist):
print("Yes")
else:
print("No")
需要太长时间。当我尝试打印plist
的元素时,该过程最终会被杀死,因为它会产生太多的排列。但它应该只是字符串本身长度的排列。
我的输入是:
plist
我希望输出为Dcoderplatform
patlodercDmfro
。但我得到相反的输出(Yes
)。
如何改进算法?
答案 0 :(得分:2)
即使您只生成与输入字符串长度相同的排列,排列的数量也会非常大。考虑示例中的字符串:Dcoderplatform
。排列的数量是字符串长度的阶乘。在这种情况下,14!
或87178291200
排列。因此,当给定任意长度的输入字符串时,您可以期望终止进程。
幸运的是,有一种更简单的方法可以做到这一点。假设您不需要使用permutations()
函数,则应使用以下方法。
给定两个字符串str1
和str2
,你可以检查一个字符串是否是另一个字符串的排列(anagram):
str1 = 'Dcoderplatform'
str2 = 'patlodercDmfro'
if ''.join(sorted(str1)) == ''.join(sorted(str2)):
print('{} and {} are anagrams'.format(str1, str2))
答案 1 :(得分:-1)
我认为你应该这样比较:
if(any("".join(x)==mystr[1] for x in plist)):