我正在处理简单的问题,检查两个字符串是否是字谜。 我写了简单的代码,可以检查,是否有两个字符串,如 '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
答案 0 :(得分:7)
你的算法没问题。你的问题是你不考虑大写和小写字母。改变两行
alist1 = list(deleteSpaces(s1))
alist2 = list(deleteSpaces(s2))
到
alist1 = list(deleteSpaces(s1).lower())
alist2 = list(deleteSpaces(s2).lower())
将解决您的问题。 作为替代方案,您可以简单地使用以下功能:
def anagrams(s1, s2):
def sort(s):
return sorted(s.lower()).strip()
return sort(s1) == sort(s2)
答案 1 :(得分:2)
正如其他人所指出的那样,你的算法被赋予“假”结果Moon starter
而Astronomer
实际上不是字谜。
只需使用可用的对象方法,即可彻底改进算法。他们已经提供了所有功能。
def normalize_str(s):
return s.replace(" ","").lower()
def anagramSolution2(s1,s2):
return sorted(normalize_str(s1)) == sorted(normalize_str(s2))
normalize_str
与您的deleteSpaces
类似,但它也会将所有内容转换为小写。这样,Moon
和moon
将相等。你最后可能想要更严格或更宽松的规范化,这只是一个例子。
对sorted
的调用已经为您提供list
,您无需进行显式转换。另外,通过list
进行的==
比较将比较list
s元素(您使用for
循环执行的操作),但效率更高。
答案 2 :(得分:1)
这样的东西?
$ cat /tmp/tmp1.py
#!/usr/bin/env python
def anagram (first, second):
return sorted(first.lower()) == sorted(second.lower())
if __name__ == "__main__":
for first, second in [("abcd rsh", "abcd x rsh"), ("123 456 789", "918273645 ")]:
print("is anagram('{0}', '{1}')? {2}".format(first, second, anagram(first, second)))
给出:
$ python3 /tmp/tmp1.py
is anagram('abcd rsh', 'abcd x rsh')? False
is anagram('123 456 789', '918273645 ')? True
答案 3 :(得分:0)
a=input("string1:");
b=input("string2:");
def anagram(a,b):
arra=split(a)
arrb=split(b)
arra.sort()
arrb.sort()
if (len(arra)==len(arrb)):
if(arra==arrb):
print ("True")
else:
ana=0;
print ("False");
else:
print ("False");
def split(x):
x=x.replace(' ','').lower()
temp=[]
for i in x:
temp.append(i)
return temp;
anagram(a,b)
答案 4 :(得分:0)
懒惰的方式,但超级干净:
def anagram(a,b):
return cleanString(a) == cleanString(b)
def cleanString(string):
return ''.join(sorted(string)).lower().split()
答案 5 :(得分:0)
def anagram(str1,str2):
l1=list(str1)
l2=list(str2)
if sorted(l1) == sorted(l2):
print("yess")
else:
print("noo")
str1='listen'
str2='silent'
anagram(str1,str2)
虽然不是最优化的解决方案,但效果很好。
答案 6 :(得分:0)
我找到了最好的方法:
from collections import Counter
def is_anagram(string1, string2):
return Counter(string1) == Counter(string2)
答案 7 :(得分:-1)
我试过这个并且有效
def is_anagram(word1,word2):
a = len(word1)
b = len(word2)
if a == b:
for l in word1:
if l in word2:
return True
return False