Skip to content

Instantly share code, notes, and snippets.

@dubcdr
Created September 30, 2021 16:57
Show Gist options
  • Save dubcdr/65c88e4037335f131bbbc1e954ec7e75 to your computer and use it in GitHub Desktop.
Save dubcdr/65c88e4037335f131bbbc1e954ec7e75 to your computer and use it in GitHub Desktop.
Find K Frequent Words
const findKMostFrequentWords = (str: string, k: number): string[] => {
const words = buildWordArr(str);
const wordToCount = buildMap(words);
const countToWord = invertMap(wordToCount);
const sortedCounts = Array.from(countToWord.keys()).sort((a,b) => {
return b - a;
});
const kHighestCounts = sortedCounts.slice(0,k);
let results = [] as string[];
for (let i = 0; i < k; i++) {
if (i >= kHighestCounts.length) {
break;
}
const currentWords = countToWord.get(kHighestCounts[i]) as string[];
results = [...results, ...currentWords];
if (results.length >= k) {
break;
}
}
return results.slice(0, k);
}
const buildWordArr = (str: string): string[] => {
const regex = /[\w|'|-]+/g;
let results = str.match(regex);
if (results === null) {
return []
}
return Array.from(results);
}
const buildMap = (words: string[]): Map<string, number> => {
const map = new Map<string, number>();
for (let i = 0; i < words.length; i++) {
const word = words[i];
const count = map.get(word);
if (count !== undefined) {
map.set(word, count + 1);
} else {
map.set(word, 1)
}
}
return map;
}
const invertMap = (wordToCount: Map<string, number>): Map<number, string[]> => {
const countToKey = new Map<number, string[]>();
for (let word of wordToCount.keys()) {
const count = wordToCount.get(word) as number;
const words = countToKey.get(count);
if (words !== undefined) {
words.push(word);
} else {
countToKey.set(count, [word]);
}
}
return countToKey;
}
const str = `hello world, what world are you in today brother? brother devin i'm in the same world you are`
const lorem = `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vel fringilla est ullamcorper eget nulla facilisi etiam. Adipiscing diam donec adipiscing tristique risus nec feugiat. Pulvinar proin gravida hendrerit lectus. Feugiat nisl pretium fusce id. Imperdiet proin fermentum leo vel orci porta non. Scelerisque eleifend donec pretium vulputate sapien nec. Pretium vulputate sapien nec sagittis aliquam. Elit duis tristique sollicitudin nibh sit amet commodo. Ornare lectus sit amet est placerat in egestas erat. Diam volutpat commodo sed egestas.`
const lessThankK = `hello`;
const empty = ``;
console.log('debug string')
console.log(findKMostFrequentWords(str, 2));
console.log('lorem');
console.log(findKMostFrequentWords(lorem, 2));
console.log('shorter than k');
console.log(findKMostFrequentWords(lessThankK, 2));
console.log('empty');
console.log(findKMostFrequentWords(empty, 2));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment