Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
According to wikipedia, An anagram is a type of word play, the result of rearranging the letters of a word or phrase to produce a new word or phrase, using all the original letters exactly once. So we can use a hashmap to store the set of anagrams with the key as letters alphabetical ordered.
C++ Code:
/* * func: get_key * goal: reordering the word in lexical order * @param word: input string * return: reordered word */ string get_key(const string& word){ vector<int> letter_map(26, 0); for(const char &letter : word){ letter_map[letter-'a'] += 1; } string result = ""; for(int i=0; i<26; ++i){ for(int j=0; j < letter_map[i];++j){ result += i + 'a'; } } return result; } /* * func: group_anagram * goal: group strings that are anagrams * @param strs: an array of strings * return: vector of anagrams */ /* * use a hashmap to help identify anagrams * complexity: time O(n), space O(n) */ vector<string> anagrams(vector<string> &strs){ vector<string> result; unordered_map<string, vector<string> > dict; for(const string &word : strs){ string key = get_key(word); dict[key].emplace_back(word); } for(auto it = dict.begin(); it != dict.end(); ++it){ if((it->second).size() > 1){ for(const string &word : it->second){ result.emplace_back(word); } } } return result; }
Python Code:
# func: return all groups of strings that are anagrams # @param strs: input word list # @return: a list of words which are anagrams def anagrams(strs): word_dict = {} for word in strs: convert_word = list(word) convert_word.sort() convert_word = ''.join(x for x in convert_word) if convert_word in word_dict: word_dict[convert_word].append(word) else: word_dict[convert_word] = [word] result = [] for word in word_dict: if len(word_dict[word]) > 1: result += [anagram for anagram in word_dict[word]] return result
No comments:
Post a Comment