Problem Statement
Given an array of strings, group anagrams together.
Example:
Input: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
Note:
- All inputs will be in lowercase.
- The order of your output does not matter.
Video Tutorial
You can find the detailed video tutorial hereThought Process
Every time we hear about anagrams, we automatically think would relate to how to find two words are anagrams, where we can solve in O(N), easy. That would result in a brute force solution.Another quick thought would be sort each word and keep a map to track it, however, sorting is also not free.
Now we think harder, how can we avoid the O(MlgM) sorting (M is the word length) as the map's lookup key? Now the question becomes how we can generate a unique value (ideally string) for the same set of characters regardless of its order? This is similar to the MD5 or SHA1 or hash value of certain object. So we can keep an array of chars, count the chars and translate that array into a string. Note simply count the sum of the array won't work, e.g., "ac" and "bb" will result in the same value.
Solutions
Brute force, for every pair of string in the array, check if they are anagrams.
Time Complexity:O(M*N^2), M is the word length, and N is the string array length
Space Complexity: O(N)
Sort each string as key
As described above,we sort each string and use it as the lookup key so we can group the anagrams.Time Complexity: O(N*M*LgM), M is the word length, and N is the string array length
Space Complexity: O(N)
"Hash" each string as key
Kind similar to hashing, we covert each string as key by generating a unique value using linear algorithm instead of sorting NlgN algorithm.Time Complexity: O(N*M), M is the word length, and N is the string array length
Space Complexity: O(N)
No comments:
Post a Comment
Thank your for your comment! Check out us at https://baozitraining.org/ if you need mock interviews!