检查字符串是不是是字谜

Posted

技术标签:

【中文标题】检查字符串是不是是字谜【英文标题】:Check if strings are anagrams检查字符串是否是字谜 【发布时间】:2021-10-10 16:39:23 【问题描述】:

我想创建一个python函数来检查给定的字符串是否是字谜,如果只有一个单词不匹配,则此代码有效,即如果字符串不好并且爸爸它返回'b'并且'd' 但如果字符串是 'zippo' 和 'hipps' 它只返回 z 和 h,我应该如何修改代码以返回所有不匹配的值。

def anagram(str_1, str_2):
  '''
  This function check if two string are anagram,
  if yes then prints yes otherwise it checks 
  for the words that need to be deleted to make it an anagram.
  '''
  if sorted(str_1) == sorted(str_2):
    return "The given strings are anagrams"
  
  else:
    # words_needed_to_removed = []
    zipped_strings = zip(str_1,str_2)
    for (i,j) in zipped_strings:
      if i!=j:
        return i,j
        # words_needed_to_removed.append((i,j))
        # return f"The words needed to be removed to make the strings an anagram are:words_needed_to_removed"

【问题讨论】:

【参考方案1】:

你有两个选择

    而不是return 使用yield 不要在找到不相等的值后立即返回,而是将一些 list 中的值存储为 tuples,然后返回 list

另外,另一个建议是:

不是对字符串进行排序,而是查找特定字符串中每个字符的计数,然后进行比较。

排序需要 O(nlogn) 而计数只需 O(n)。虽然这增加了空间复杂性。

【讨论】:

【参考方案2】:

要返回所有内容,请将其添加到列表中,然后在循环结束时返回列表。

def anagram(str_1, str_2):
  if sorted(str_1) == sorted(str_2):
    return "The given strings are anagrams"
  else:
    zipped_strings = zip(str_1,str_2)
    all_letters = []
    for (i,j) in zipped_strings:
      if i!=j:
        all_letters.append((i, j))
    return all_letters

但是,您的代码不适用于排序顺序导致匹配字母之间发生偏移的情况。例如:anagram("ohipzs", "hipzas") 给出 [('o', 'h'), ('h', 'i'), ('i', 'p'), ('p', 'z'), ('z', 'a')],尽管唯一不匹配的是 'o''a'

相反,您可以先创建一个计数器,其中包含第一个单词中所有字母的计数。

counter = dict()
for letter in word1:
    counter[letter] = counter.get(letter, 0) + 1

接下来,从这个计数器中减去第二个单词的所有字母

for letter in word2:
    counter[letter] = counter.get(letter, 0) - 1

最后,返回counter的所有不为零值的键

mismatch_letters_1 = []
mismatch_letters_2 = []
for letter, count in counter.items():
    if count == 0:
        # Counts match perfectly, skip this letter
        continue
    elif count > 0:
        append_to_list = mismatch_letters_1
    else:
        append_to_list = mismatch_letters_2

    for _ in range(abs(count)):
        append_to_list.append(letter)

answer = [(i, j) for i, j in zip(mismatch_letters_1, mismatch_letters_2)]

把它放到一个函数中并测试给出:

anagram2("bad", "dad") -> [('b', 'd')] anagram2("zippo", "hipps") -> [('z', 'h'), ('o', 's')] anagram2("ohipzs", "hipzas") -> [('o', 'a')]

【讨论】:

以上是关于检查字符串是不是是字谜的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 检查两个字符串是不是是字谜

如何检查两个字符串是不是是字谜?

使用基本Java检查两个字符串是不是是彼此的字谜[重复]

为了检查两个字符串是不是是字谜, hashfunction() 的逻辑应该是啥?

检查两个字符串是不是是字谜的运行时间应该是多少

这是一个字谜程序,我正在检查两个相同长度的字符串是不是相互字谜