-
Notifications
You must be signed in to change notification settings - Fork 0
/
17 - is_an_anagram.py
74 lines (54 loc) · 3.26 KB
/
17 - is_an_anagram.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
def main():
str_a = "Реверс"
str_b = "Сервер"
print("\n" + str_a)
print(str_b)
print(f"Являются ли эти строки анаграммами? Ответ: {'Да' if is_anagram(str_a, str_b) else 'Нет'}.")
str_c = "Полотно навсегда останется свежим"
str_d = "А всегда ли свет стекает сквозь жалюзи"
print("\n" + str_c)
print(str_d)
print(f"Являются ли эти строки анаграммами? Ответ: {'Да' if is_anagram(str_c, str_d) else 'Нет'}.")
str_e = "Ракета"
str_f = "Карета"
print("\n" + str_e)
print(str_f)
print(f"Являются ли эти строки анаграммами? Ответ: {'Да' if is_anagram(str_e, str_f) else 'Нет'}.")
str_g = "Мангуст"
str_h = "Мустанг"
print("\n" + str_g)
print(str_h)
print(f"Являются ли эти строки анаграммами? Ответ: {'Да' if is_anagram(str_g, str_h) else 'Нет'}.")
def is_anagram(text_a, text_b):
# Переводим обе строки в одинаковый регистр (например, нижний).
text_a_lower = text_a.lower()
text_b_lower = text_b.lower()
# Составляем из каждой строки множество, чтобы потом не проверять повторяющиеся буквы.
text_a_set = set(text_a_lower)
text_b_set = set(text_b_lower)
# Нужно очистить множества от всего, кроме значащих символов.
remove_chars = (" ", ".", ",", "-", "'", "?", "!")
for ch in remove_chars:
text_a_set.discard(ch)
text_b_set.discard(ch)
# Здесь уже сравниваем сами множества, и количество вхождений каждой буквы в исходные строки.
if text_a_set == text_b_set:
for letter in text_a_set:
if text_a_lower.count(letter) != text_b_lower.count(letter):
return False
else:
return True # Если цикл прошёлся по всем буквам множества и False ни разу не выпал, тогда всё совпадает.
else:
return False # Если множества содержат разные элементы, то и смысла проверять что-то дополнительно нет.
# Альтернативная реализация задачи с помощью другого алгоритма.
def is_anagram_second(text_a, text_b):
text_a_list = list(text_a.lower())
text_b_list = list(text_b.lower())
# Оставляем в списках только буквы и числа.
text_a_list = list(filter(lambda ch: ch.isalpha() or ch.isdigit(), text_a_list))
text_b_list = list(filter(lambda ch: ch.isalpha() or ch.isdigit(), text_b_list))
# Сортируем оба списка, и проверяем, получились ли эти списки одинаковыми.
text_a_list.sort()
text_b_list.sort()
return text_a_list == text_b_list
main()