【发布时间】: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