Python -比较2个单词并检查它们是否是变位词

mlnl4t2r  于 2023-05-30  发布在  Python
关注(0)|答案(4)|浏览(111)

我试图定义一个函数,它接受两个字符串,比较这两个字符串,如果它们是变位词,则返回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,但我不知道。有人能帮我吗?

enxuqcxy

enxuqcxy1#

我认为最简单的方法是对字符串进行排序并比较它们,就像这个例子一样:

def check_anagram(a = '', b = ''):
    return sorted(a) == sorted(b)

测试1:

a = "python"
b = "nohtyp"
print(check_anagram(a, b))

输出:

>>> True

测试2:

a = "aaaaaaaaaabbbbbbbbb"
b = "ababababbbababababab"
print(check_anagram(a, b))

输出:

>>> False

测试3:

a = "xxxyyyxxx"
b = "yyyxxxyyy"
print(check_anagram(a, b))

输出:

>>> False
vdzxcuhz

vdzxcuhz2#

您的两个测试用例都返回true,因为在检查字符是否存在之后,您没有从str2中删除这些字符。例如,比较以下两个字符串:
str1 = aastr2 = a
我们希望您的比较结果是False,因为它们显然不是字谜。但是,检查str1中的两个a字符中的每一个都会返回True,因为str2也包含a。更好(更快)的方法可能是先处理字符串,如下所示:

# return a dictionary, where each key is the 
# count of that letter in the string
def process_str(str):
    dic = {}
    for letter in str:
        if letter in dic:
            dic[letter] += 1
        else:
            dic[letter] = 1
    return dic

def check_anagram(str1, str2):
    dic1 = process_str(str1)
    dic2 = process_str(str2)

    # does every key in dic1 have a corresponding key in dic2?
    for key in dic1:
        if not key in dic2:
            return False
        if not dic1[key] == dic2[key]:
            return False

    # does every key in dic2 have a corresponding key in dic1?
    for key in dic2:
        if not key in dic1:
            return False
        if not dic1[key] == dic2[key]:
            return False

    return True

应该可以了

dced5bon

dced5bon3#

目前,您的代码将始终返回True。

for i in range(0, len(str1), 1):

如果字符串是“python”,这将迭代str1的长度范围。for循环将为'i'提供以下值:0,1,2,3,4,5如果你想遍历每个字母,请写

for i in str1:

这将使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。
由于字符串是不可变的,所以可以先将它们放在一个列表中,然后遍历该列表。
查看以下代码:

def check_anagram(str1, str2):
    if len(str1) != len(str2):
        return False
    else:
        string1 = [x for x in str1] # put str1 in list string1
        string2 = [x for x in str2]
        for i in range(0, len(str2), 1): # iterate over the range (length) of str2
            if string1[i] in string2: # if letter in position i of string1 occurs in string 2 then:
                string2.remove(string1[i]) # remove that letter from the string2 list
            else: 
                return False # if it does NOT occur in string2, it is NOT an anagram, so return false
        return True # If the loop went correctly, return true

edit:如果你想删除空白(空格)(因为“ars magna”是“anagrams”的一个变位词,但程序不会拾取它,因为长度不同),你必须在开始时这样做。替换字符串中的空格可以通过.replace(WHAT TO REPLACE,REPLACE WITH THIS)函数来完成。将其放在check_anagram函数的开头:

str1 = str1.replace(" ", "")
str2 = str2.replace(" ", "")
jw5wzhpr

jw5wzhpr4#

有一个非常快速的方法来检查两个字符串是否是变位词。
这也是leetcode问题https://leetcode.com/problems/valid-anagram/的答案。

算法

1. Check if the length of s and t are unequal, if yes return false
2. Create Two maps sCount and tCount which will store the character count of both the strings
    a. Example : { 'a': 2, 'n':1}
3. Loop through either s or t string and Push the character count in the map for both s and t string.
4. Check if both the maps are equal once the loop is done.

时间复杂度:O(len(S))
**空间复杂度:O(1)

解决方案

class Solution:
def isAnagram(self, s: str, t: str) -> bool:
  
  if len(s) != len(t):
    return False
  
  sMap, tMap = {} , {}
  
  for i in range(len(s)):
    sMap[s[i]] = 1+ sMap.get(s[i],0)
    tMap[t[i]] = 1+ tMap.get(t[i],0)
  
  return sMap == tMap

相关问题