nhb-toolbox
Version:
A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.
43 lines (42 loc) • 1.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateAnagrams = generateAnagrams;
const non_primitives_1 = require("../guards/non-primitives");
const primitives_1 = require("../guards/primitives");
const DICT_CACHE = new WeakMap();
function _getDictSet(dict) {
if (DICT_CACHE.has(dict))
return DICT_CACHE.get(dict);
const dictSet = new Set(dict.map((w) => w.toLowerCase()));
DICT_CACHE.set(dict, dictSet);
return dictSet;
}
function generateAnagrams(word, options) {
if (!(0, primitives_1.isNonEmptyString)(word))
return [];
if (word?.length === 1)
return [word?.toLowerCase()];
const { limit = 100, dictionary = false } = options || {};
const outSet = new Set();
const dictSet = (0, non_primitives_1.isValidArray)(dictionary) ? _getDictSet(dictionary) : undefined;
const _permute = (current, remaining) => {
if (!remaining.length) {
if (!dictSet || dictSet.has(current)) {
outSet.add(current);
}
return;
}
const usedSet = new Set();
for (let i = 0; i < remaining.length; i++) {
const char = remaining[i];
if (usedSet.has(char))
continue;
usedSet.add(char);
if (limit !== 'all' && outSet.size >= limit)
return;
_permute(current + char, remaining.slice(0, i) + remaining.slice(i + 1));
}
};
_permute('', word.toLowerCase());
return [...outSet];
}