<p>Given an array of strings <code>strs</code>, group the <span data-keyword="anagram">anagrams</span> together. You can return the answer in <strong>any order</strong>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">strs = [&quot;eat&quot;,&quot;tea&quot;,&quot;tan&quot;,&quot;ate&quot;,&quot;nat&quot;,&quot;bat&quot;]</span></p>

<p><strong>Output:</strong> <span class="example-io">[[&quot;bat&quot;],[&quot;nat&quot;,&quot;tan&quot;],[&quot;ate&quot;,&quot;eat&quot;,&quot;tea&quot;]]</span></p>

<p><strong>Explanation:</strong></p>

<ul>
	<li>There is no string in strs that can be rearranged to form <code>&quot;bat&quot;</code>.</li>
	<li>The strings <code>&quot;nat&quot;</code> and <code>&quot;tan&quot;</code> are anagrams as they can be rearranged to form each other.</li>
	<li>The strings <code>&quot;ate&quot;</code>, <code>&quot;eat&quot;</code>, and <code>&quot;tea&quot;</code> are anagrams as they can be rearranged to form each other.</li>
</ul>
</div>

<p><strong class="example">Example 2:</strong></p>

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">strs = [&quot;&quot;]</span></p>

<p><strong>Output:</strong> <span class="example-io">[[&quot;&quot;]]</span></p>
</div>

<p><strong class="example">Example 3:</strong></p>

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">strs = [&quot;a&quot;]</span></p>

<p><strong>Output:</strong> <span class="example-io">[[&quot;a&quot;]]</span></p>
</div>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= strs.length &lt;= 10<sup>4</sup></code></li>
	<li><code>0 &lt;= strs[i].length &lt;= 100</code></li>
	<li><code>strs[i]</code> consists of lowercase English letters.</li>
</ul>

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        
        # n is defined as the total number of chars in the vector
        # O(n)
        # Convert each string to a 26 length vector array
        vectorStrs = []
        for string in strs: 
            vectorStrs.append([0 for i in range(26)])
            for char in string: 
                vectorStrs[-1][ord(char)-ord('a')] += 1
        # O(n)
        # Compare the arrays to their groupings
        results = []
        leaders = []
        
        for j in range(len(vectorStrs)): 
            vectorStr = vectorStrs[j]
            normalWord = strs[j]
            groupExists = False
            
            for i in range(len(results)): 
                leader = leaders[i]
                if self.isAnagram(leader, vectorStr): 
                    results[i].append(normalWord)
                    groupExists = True
                    break
            if not groupExists: 
                results.append([normalWord])
                leaders.append(vectorStr)
        
        # Return grouped strings
        return results
    
    def isAnagram(self, vector1: List[int], vector2: List[int]) -> bool: 
        for i in range(26): 
            if vector1[i] != vector2[i]: 
                return False
        return True
        
        
22000