#javascript #node.js
#javascript #node.js
Вопрос:
Я хочу сохранить пару анаграмм в массиве.
Вводом будет массив.
Пример:
let inputArray = ["abcd", "dbac", "adfs", "adsf", "bDca"];
Он должен игнорировать регистр букв. Здесь «abcd и bDca» являются анаграммами.
выводом должен быть массив, содержащий пару анаграмм.
Example: [
'abcd is anagram of dbac',
'adfs is anagram of adsf',
'abcd is anagram of bDca'
]
Комментарии:
1. итак, когда вы говорите
optimized
, покажите нам код, который у вас есть сейчас.
Ответ №1:
Как вы уже упоминали, поиск всех подмножеств, а затем поиск анаграмм не является оптимизированным решением. Мы можем использовать hashmap и некоторые встроенные методы в node.js . Отсортируйте каждую строку в массиве, чтобы упростить сравнение для анаграммы. Сохраните отсортированную строку в hashmap. Если существует ключ с той же строкой, это будет анаграмма. Вот полное решение в Node.js
let inputArray = ["abcd", "dbac", "adfs", "adsf", "bDca"];
let map = {};
let outputArray = [];
inputArray.forEach((anaString, index) => {
let sortedString = anaString.toLowerCase().split("").sort().join("");
if (map[sortedString] != null) {
outputArray.push(sortedString " is anagram of " anaString);
}
else {
map[sortedString] = index;
}
});
console.log(outputArray);
Комментарии:
1. Я видел много решений, использующих много строк кода для реализации этого. Это решение отличное и помогло мне понять. Большое вам спасибо.
Ответ №2:
Недавно я решил проблему, аналогичную той, что в java 8, которую я могу легко перевести на javascript для вас.
Наивный способ сделать это — перебрать все возможности, а затем перебрать массив, чтобы увидеть, совпадает ли что-нибудь. Однако это было бы чрезвычайно медленно. Чтобы преодолеть это, мы можем создать «шаблон» и сопоставить его с другими по мере продвижения по массиву.
Следующий код должен решить вашу проблему
function pattern(str){
let map = new Map()
let curcount = 0
let pattern = ""
for(var i = 0; i < str.length; i ){
if(!map.get(str.charAt(i) '')){
pattern =String.fromCharCode(curcount);
map.put(str.charAt(i) "",String.fromCharCode(curcount));
curcount ;
}
else{
pattern =map.get(str.charAt(i) "");
}
}
}
Остальное очень легко сделать, создайте другую карту (ключ — шаблон, значение — массив строк) и запишите каждый экземпляр шаблона, если он существует, вставьте слово в массив. и вы будете настроены 🙂