Anagrams คือ คำที่ประกอบด้วยตัวอักษรชุดเดียวกัน แต่เรียงลำดับต่างกัน (เช่น "cat" และ "tac", "listen" และ "silent")
Input/Output
Input: ['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac'] Output: [['cat', 'tac'], ['dog', 'god'], ['fried', 'fired'], ['pat', 'tap']]
ขั้นตอนการแก้ปัญหา
- สร้างฟังก์ชันเช็ค Anagram: เรียงตัวอักษรทั้ง 2 คำ ถ้าเท่ากัน = Anagram
- ใช้ Dictionary จัดกลุ่ม: Key = ตัวอักษรที่เรียงแล้ว, Value = ลิสต์คำ
ตัวอย่างโค้ด
ฟังก์ชันเช็ค Anagram
are_anagrams = lambda x, y: str(sorted(x.lower())) == str(sorted(y.lower()))
print(are_anagrams('cat', 'tac')) # True
print(are_anagrams('cat', 'Tac')) # True (case insensitive)
print(are_anagrams('cat', 'dog')) # False
จัดกลุ่ม Anagrams ทั้งลิสต์
anagrams = ['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac']
grouped_anagrams = {}
for word in anagrams:
sorted_word = str(sorted(word))
if sorted_word in grouped_anagrams:
grouped_anagrams[sorted_word].append(word)
else:
grouped_anagrams[sorted_word] = [word]
print(list(grouped_anagrams.values()))
ผลลัพธ์
[['dog', 'god'], ['pat', 'tap'], ['cat', 'tac'], ['fired', 'fried']]
การปรับปรุงด้วย defaultdict
from collections import defaultdict
anagrams = ['cat', 'dog', 'fired', 'god', 'pat', 'tap', 'fried', 'tac']
grouped = defaultdict(list)
for word in anagrams:
grouped[str(sorted(word))].append(word)
print(list(grouped.values()))
Complexity: O(N * K log K) โดย N = จำนวนคำ, K = ความยาวคำเฉลี่ย (จากการ sort)