我试图定义一个函数,它接受两个字符串,比较这两个字符串,如果它们是变位词,则返回True。我不想导入集合。
因此,如果string1是python
,而string2是nohtyp
,则应该返回True
。否则,很明显,返回false
。下面是我的代码看起来像到目前为止:
def check_anagram(str1, str2):
if len(str1) != len(str2):
return False
else:
for i in range(0, len(str1), 1):
if i in range(0, len(str2), 1):
return True
else:
return False
它在大多数情况下都能正常工作,但是当str1是aaaaaaaaaabbbbbbbbbb
,str2是ababababbbababababab
时,它返回true,当str1是xxxyyyxxx
,str2是yyyxxxyyy
时,它也返回True
。
对于这两种情况,它应该返回False
,但我不知道。有人能帮我吗?
4条答案
按热度按时间enxuqcxy1#
我认为最简单的方法是对字符串进行排序并比较它们,就像这个例子一样:
测试1:
输出:
测试2:
输出:
测试3:
输出:
vdzxcuhz2#
您的两个测试用例都返回true,因为在检查字符是否存在之后,您没有从str2中删除这些字符。例如,比较以下两个字符串:
str1 = aa
和str2 = a
我们希望您的比较结果是
False
,因为它们显然不是字谜。但是,检查str1
中的两个a
字符中的每一个都会返回True
,因为str2
也包含a
。更好(更快)的方法可能是先处理字符串,如下所示:应该可以了
dced5bon3#
目前,您的代码将始终返回True。
如果字符串是“python”,这将迭代str1的长度范围。for循环将为'i'提供以下值:0,1,2,3,4,5如果你想遍历每个字母,请写
这将使i的值:p,y,t,h,o,n
或者,如果您使用范围,您可以使用str1[i]检查单个字母。这将输出以下内容:str1[0] ==“p”,str1[1] ==“y”等。
因为你在if语句中做了同样的事情,它会检查range(0,6)中的'i'是否等于i。'i'的第一个值将是0,在第一次检查之后,它将通过if语句并将返回True,这意味着它将结束循环。这意味着它将只检查第一个案例。
你要做的是检查str1中的每个字母,如果它在str2中的任何地方,从str2中删除该示例并检查下一个字母。如果在任何时候字符不在str2中,则返回False。在检查了所有字母并且没有返回False之后,返回True。
由于字符串是不可变的,所以可以先将它们放在一个列表中,然后遍历该列表。
查看以下代码:
edit:如果你想删除空白(空格)(因为“ars magna”是“anagrams”的一个变位词,但程序不会拾取它,因为长度不同),你必须在开始时这样做。替换字符串中的空格可以通过.replace(WHAT TO REPLACE,REPLACE WITH THIS)函数来完成。将其放在check_anagram函数的开头:
jw5wzhpr4#
有一个非常快速的方法来检查两个字符串是否是变位词。
这也是leetcode问题https://leetcode.com/problems/valid-anagram/的答案。
算法
时间复杂度:O(len(S))
**空间复杂度:O(1)
解决方案