检查字符串是否为字谜

2024-06-01 21:43:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个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}"

Tags: to字符串代码forreturnifitare
2条回答

你有两个选择

  1. 使用yield代替return
  2. 不要在发现不相等的值时立即返回,而是将值存储在一些list中作为tuple存储,然后返回list

此外,另一项建议是:

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

排序需要O(nlogn),而计数只需要O(n)。尽管这增加了空间的复杂性

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

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')]

相关问题 更多 >