Design a method to find the frequency of occurrences of any given word in a book. What if we were running this algorithm multiple times?
You should implement following methods:
WordsFrequency(book) constructor, parameter is a array of strings, representing the book.
get(word) get the frequency of word in the book.
Example:
WordsFrequency wordsFrequency = new WordsFrequency({"i", "have", "an", "apple", "he", "have", "a", "pen"});
wordsFrequency.get("you"); //returns 0,"you" is not in the book
wordsFrequency.get("have"); //returns 2,"have" occurs twice in the book
wordsFrequency.get("an"); //returns 1
wordsFrequency.get("apple"); //returns 1
wordsFrequency.get("pen"); //returns 1
Note:
There are only lowercase letters in book[i].
1 <= book.length <= 100000
1 <= book[i].length <= 10
get function will not be called more than 100000 times.
Solutions
Solution 1: Hash Table
We use a hash table $cnt$ to count the number of occurrences of each word in $book$.
When calling the get function, we only need to return the number of occurrences of the corresponding word in $cnt$.
In terms of time complexity, the time complexity of initializing the hash table $cnt$ is $O(n)$, where $n$ is the length of $book$. The time complexity of the get function is $O(1)$. The space complexity is $O(n)$.
1 2 3 4 5 6 7 8 91011
classWordsFrequency:def__init__(self,book:List[str]):self.cnt=Counter(book)defget(self,word:str)->int:returnself.cnt[word]# Your WordsFrequency object will be instantiated and called as such:# obj = WordsFrequency(book)# param_1 = obj.get(word)
1 2 3 4 5 6 7 8 910111213141516171819
classWordsFrequency{privateMap<String,Integer>cnt=newHashMap<>();publicWordsFrequency(String[]book){for(Stringx:book){cnt.merge(x,1,Integer::sum);}}publicintget(Stringword){returncnt.getOrDefault(word,0);}}/** * Your WordsFrequency object will be instantiated and called as such: * WordsFrequency obj = new WordsFrequency(book); * int param_1 = obj.get(word); */
1 2 3 4 5 6 7 8 9101112131415161718192021
classWordsFrequency{public:WordsFrequency(vector<string>&book){for(auto&x:book){++cnt[x];}}intget(stringword){returncnt[word];}private:unordered_map<string,int>cnt;};/** * Your WordsFrequency object will be instantiated and called as such: * WordsFrequency* obj = new WordsFrequency(book); * int param_1 = obj->get(word); */
1 2 3 4 5 6 7 8 9101112131415161718192021
typeWordsFrequencystruct{cntmap[string]int}funcConstructor(book[]string)WordsFrequency{cnt:=map[string]int{}for_,x:=rangebook{cnt[x]++}returnWordsFrequency{cnt}}func(this*WordsFrequency)Get(wordstring)int{returnthis.cnt[word]}/** * Your WordsFrequency object will be instantiated and called as such: * obj := Constructor(book); * param_1 := obj.Get(word); */
1 2 3 4 5 6 7 8 9101112131415161718192021
classWordsFrequency{privatecnt:Map<string,number>;constructor(book:string[]){constcnt=newMap<string,number>();for(constwordofbook){cnt.set(word,(cnt.get(word)??0)+1);}this.cnt=cnt;}get(word:string):number{returnthis.cnt.get(word)??0;}}/** * Your WordsFrequency object will be instantiated and called as such: * var obj = new WordsFrequency(book) * var param_1 = obj.get(word) */
1 2 3 4 5 6 7 8 910111213141516171819202122
usestd::collections::HashMap;structWordsFrequency{cnt:HashMap<String,i32>,}/** * `&self` means the method takes an immutable reference. * If you need a mutable reference, change it to `&mut self` instead. */implWordsFrequency{fnnew(book:Vec<String>)->Self{letmutcnt=HashMap::new();forwordinbook.into_iter(){*cnt.entry(word).or_insert(0)+=1;}Self{cnt}}fnget(&self,word:String)->i32{*self.cnt.get(&word).unwrap_or(&0)}}
1 2 3 4 5 6 7 8 91011121314151617181920212223
/** * @param {string[]} book */varWordsFrequency=function(book){this.cnt=newMap();for(constxofbook){this.cnt.set(x,(this.cnt.get(x)||0)+1);}};/** * @param {string} word * @return {number} */WordsFrequency.prototype.get=function(word){returnthis.cnt.get(word)||0;};/** * Your WordsFrequency object will be instantiated and called as such: * var obj = new WordsFrequency(book) * var param_1 = obj.get(word) */