【问题标题】:Writing a function which accepts two strings and returns True in python 3在python 3中编写一个接受两个字符串并返回True的函数
【发布时间】:2019-03-17 14:12:17
【问题描述】:

编写一个python函数check_anagram(),它接受两个字符串并返回True,如果一个字符串是另一个字符串的变位词。否则返回 False。

如果两个字符串包含重复字符但没有一个字符在同一位置重复,则它们被认为是一个字谜。字符串的长度应该相同。

注意:在适用的情况下执行不区分大小写的比较。

这是我的代码:

def check_anagram(data1,data2):
    first = data1.lower()
    second = data2.lower()

    d1 = []
    d2 = []

    for i in range(0, len(first)):
        d1.append(first[i])
    for i in range(0, len(second)):
        d2.append(second[i])

    for_check1 = sorted(d1)
    for_check2 = sorted(d2)
    if (for_check1 != for_check2):
        return False

    count = 0
    if (len(d1) == len(d2)):
        for i in d1:
            for j in d2:
                if(i == j):
                    a = d1.index(i)
                    b = d2.index(j)
                    if(a == b):
                        return False
                    else:
                        count += 1
    if(count == len(first)):
        return True
    else:
        return False

    print(check_anagram("Schoolmaster", "Theclassroom"))

我得到的输出是“假”

虽然这个程序为 {silent, listen}{Moonstarrer, Astronomer}{apple, mango} 等字符串值提供相关输出,但不是为上述两个字符串(代码中)

我在这段代码中遗漏了哪些情况?这东西怎么整?

【问题讨论】:

  • 警告none of the characters repeat at the same position 这段代码对我有用(虽然效率低下),这似乎是什么问题?
  • 我在遵循您的逻辑时遇到了真正的麻烦。对两个字符串进行排序使得解决方案 O(n * log n),这是不必要的,它可以在 O(n) 中完成。但是,既然你在第 13-14 行对这两个字符串进行排序,为什么不简单地使用这些排序的字符串呢?该方法的其余部分在做什么?
  • @DeepSpace:从技术上讲,它是 O(3 * min(length(data1), length(data2)) + 2* size(alphabet)) 时间和 O(2 * size(alphabet))空间。也许这已经足以让您弄清楚了?如果没有,这里的诀窍是:计算每个字符的出现次数(O(n) 遍历每个字符串,其中 n ~ 字符串的长度),然后比较两个结果(O(n) 遍历数组,其中n ~ 字母的大小)。如果字符串的每个字符的数量相同,则字符串是字谜。可以检查不属于字谜正常定义的附加限制……
  • … 单独第三次遍历字符串。或者,正如我刚刚意识到的,可以集成到计数通道中。
  • 你能用文字解释一下你的算法是什么吗? -您尝试使用哪个过程来确定两个字符串是否是字谜?

标签: python


【解决方案1】:

你的函数可以简化为:

def check_anagram(data1, data2):
    data1 = data1.lower()
    data2 = data2.lower()
    if sorted(data1) != sorted(data2):
        return False
    return all(data1[i] != data2[i] for i in range(len(data1)))

这实际上适用于您指定的情况。

【讨论】:

    【解决方案2】:

    您的代码是正确的,只需写 len(second) 而不是 count。

    def check_anagram(data1,data2):
        first = data1.lower()
        second = data2.lower()
    
        d1 = []
        d2 = []
    
        for i in range(0, len(first)):
            d1.append(first[i])
        for i in range(0, len(second)):
            d2.append(second[i])
    
        for_check1 = sorted(d1)
        for_check2 = sorted(d2)
        if (for_check1 != for_check2):
            return False
    
        count = 0
        if (len(d1) == len(d2)):
            for i in d1:
                for j in d2:
                    if(i == j):
                        a = d1.index(i)
                        b = d2.index(j)
                        if(a == b):
                            return False
                        else:
                            count += 1
        if(len(second) == len(first)):
            return True
        else:
            return False
    
        print(check_anagram("Schoolmaster", "Theclassroom"))
    

    【讨论】:

      【解决方案3】:

      我的这个程序正在清除所有可能的测试用例。

      def check_anagram(data1,data2):
      
          data1=data1.lower()
          data2=data2.lower()
          if(len(data1)==len(data2)):
              if(sorted(data1)!=sorted(data2)):
                  return False
              else:
                  if(data1[i]!=data2[i] for i in range(len(data1))):
                      return True
                  else:
                      return False
          else:
              return False
          print(check_anagram("eat","tea"))
      

      【讨论】:

        猜你喜欢
        • 2022-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-01
        • 1970-01-01
        • 2020-08-18
        • 1970-01-01
        相关资源
        最近更新 更多