检查字符串是不是是字谜
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
中的值存储为 tuple
s,然后返回 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')]
【讨论】:
以上是关于检查字符串是不是是字谜的主要内容,如果未能解决你的问题,请参考以下文章