我在处理一个简单的问题:
我编写了一个简单的代码,可以检查两个字符串,比如 “abcd”和“dcba”是一个字谜,但我不知道如何处理更复杂的字谜,比如“天文学家”和“月球启动者”
line1 = input('Enter the first word: ')
line2 = input('Enter the second word: ')
def deleteSpaces(s):
s_new = s.replace(" ","")
return s_new
def anagramSolution2(s1,s2):
alist1 = list(deleteSpaces(s1))
alist2 = list(deleteSpaces(s2))
print(alist1)
print(alist2)
alist1.sort()
alist2.sort()
pos = 0
matches = True
while pos < len(deleteSpaces(s1)) and matches:
if alist1[pos]==alist2[pos]:
pos = pos + 1
else:
matches = False
return matches
首先,我认为问题在于使用空格,但后来我明白,如果字符串大小不同,我的算法就不起作用。
我不知道在那种情况下该怎么办。
在这里,我找到了一个很好的解决方案,但也不管用:
def anagrams(s1,s2):
return [False, True][sum([ord(x) for x in s1]) == sum([ord(x) for x in s2])]
如果我运行这个函数并在两个字符串上测试它,我将得到这样的输出:
Examples:
First Word: apple
Second Word: pleap
output: True
First Word: Moon starter
Second Word: Astronomer
output: False //however it should should be True because this words are anagrams
正如其他人所指出的,由于
Moon starter
和Astronomer
实际上是而不是anagrams,所以您的算法被给出“假”结果。只需使用可用的对象方法,就可以大大改进算法。它们已经提供了所有的功能。
normalize_str
与您的deleteSpaces
类似,但它也将所有内容转换为小写。这样,Moon
和moon
将比较相等。最后,您可能希望执行更严格或更宽松的规范化,这只是一个示例。对
sorted
的调用已经为您提供了一个list
,您不必执行显式转换。此外,通过==
进行的list
比较将比较list
的元素(您使用for
循环所做的操作),但效率更高。你的算法没问题。你的问题是你不考虑大写和小写字母。改变这两条线
到
会解决你的问题。 作为替代方案,您可以简单地使用以下函数:
如果您希望有一个复杂度为O(n)的更快的解决方案,应该使用计数器而不是对这两个字进行排序:
像这样的?
它给出:
相关问题 更多 >
编程相关推荐