Hai chuỗi là anagram (hoán vị từ) nếu chúng chứa cùng các ký tự với tần suất giống nhau, chỉ khác thứ tự. Ví dụ: "listen" và "silent".
Cách dùng collections.Counter
Counter đếm tần suất từng phần tử, trả về dict-like object. So sánh 2 Counter để kiểm tra anagram.
from collections import Counter
str1 = 'top spot'
str2 = 'pot post'
counter1 = Counter(str1)
counter2 = Counter(str2)
print("Counter 1:", counter1)
print("Counter 2:", counter2)
if counter1 == counter2:
print("Hai chuỗi là anagram")
else:
print("Hai chuỗi KHÔNG phải anagram")
Kết quả
Counter 1: Counter({'p': 2, 't': 2, 'o': 2, 's': 1, ' ': 1})
Counter 2: Counter({'p': 2, 't': 2, 'o': 2, 's': 1, ' ': 1})
Hai chuỗi là anagram
Xử lý case-insensitive và bỏ qua khoảng trắng
def is_anagram(s1, s2):
# Chuẩn hóa: lower, bỏ space
clean1 = s1.replace(' ', '').lower()
clean2 = s2.replace(' ', '').lower()
return Counter(clean1) == Counter(clean2)
print(is_anagram("Listen", "Silent")) # True
print(is_anagram("A gentleman", "Elegant man")) # True
print(is_anagram("Hello", "World")) # False
Cách khác: sorted()
def is_anagram_sorted(s1, s2):
return sorted(s1.replace(' ', '').lower()) == sorted(s2.replace(' ', '').lower())
So sánh
| Phương pháp | Độ phức tạp | Ưu điểm |
|---|---|---|
| Counter | O(n) | Nhanh, trực quan, có thêm most_common() |
| sorted() | O(n log n) | Không cần import, code ngắn |
Khuyến nghị: Dùng Counter cho hiệu năng và tính năng mở rộng.