1+ import unittest
2+ from typing import List
3+
4+ class Solution :
5+ def groupAnagrams (self , strs : List [str ]) -> List [List [str ]]:
6+ groups = {}
7+
8+ for word in strs :
9+ anagramKey = self .getAnagramKey (word )
10+
11+ if anagramKey not in groups :
12+ groups [anagramKey ] = []
13+ groups [anagramKey ].append (word )
14+
15+ return list (groups .values ())
16+
17+ def getAnagramKey (self , s : str ) -> tuple :
18+ freq = [0 ] * 26 # fixed length array of 26 (all lowercase letters)
19+
20+ for i in range (0 , len (s )):
21+ index = ord (s [i ]) - ord ('a' )
22+ freq [index ] = freq [index ] + 1
23+
24+
25+ return tuple (freq )
26+
27+ class TestGroupAnagrams (unittest .TestCase ):
28+ def setUp (self ):
29+ self .solution = Solution ()
30+
31+ def test_basic_anagrams (self ):
32+ strs = ["eat" ,"tea" ,"tan" ,"ate" ,"nat" ,"bat" ]
33+ result = self .solution .groupAnagrams (strs )
34+ # Sort each group and the overall result for consistent comparison
35+ result = [sorted (group ) for group in result ]
36+ result .sort (key = lambda x : x [0 ])
37+
38+ expected = [["ate" ,"eat" ,"tea" ], ["bat" ], ["nat" ,"tan" ]]
39+ expected = [sorted (group ) for group in expected ]
40+ expected .sort (key = lambda x : x [0 ])
41+
42+ self .assertEqual (result , expected )
43+
44+ def test_single_string (self ):
45+ strs = ["a" ]
46+ result = self .solution .groupAnagrams (strs )
47+ self .assertEqual (result , [["a" ]])
48+
49+ def test_empty_strings (self ):
50+ strs = ["" , "" ]
51+ result = self .solution .groupAnagrams (strs )
52+ self .assertEqual (result , [["" , "" ]])
53+
54+ def test_no_anagrams (self ):
55+ strs = ["cat" , "dog" , "pig" ]
56+ result = self .solution .groupAnagrams (strs )
57+ # Each string should be in its own group
58+ self .assertEqual (len (result ), 3 )
59+ self .assertTrue (all (len (group ) == 1 for group in result ))
60+
61+ def test_all_same_anagrams (self ):
62+ strs = ["aaa" , "aaa" ]
63+ result = self .solution .groupAnagrams (strs )
64+ self .assertEqual (result , [["aaa" , "aaa" ]])
65+
66+ def test_getAnagramKey (self ):
67+ # Test the key generation
68+ result1 = self .solution .getAnagramKey ("eat" )
69+ result2 = self .solution .getAnagramKey ("tea" )
70+ self .assertEqual (result1 , result2 )
71+
72+ result3 = self .solution .getAnagramKey ("bat" )
73+ self .assertNotEqual (result1 , result3 )
74+
75+ if __name__ == '__main__' :
76+ unittest .main ()
0 commit comments