Оптимизированный код Nodejs для поиска анаграмм строки в массиве. Решение не должно использовать все подмножества для поиска анаграммы строки

#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) "");
       }
   }
}
  

Остальное очень легко сделать, создайте другую карту (ключ — шаблон, значение — массив строк) и запишите каждый экземпляр шаблона, если он существует, вставьте слово в массив. и вы будете настроены 🙂