Поиск анаграмм в JavaScript - PullRequest
12 голосов
/ 26 мая 2009

Я должен написать программу на JavaScript, чтобы найти все анаграммы в предоставленной серии слов. Например: "Монах, Конм, Нком, Би-би-си, КББ, Делл, Ледл, Ильде" Вывод должен быть разбит на строки: 1. монах конм, нком; 2. БиБиСи КББ; 3. dell ledl, llde;

Я уже отсортировал их в алфавитном порядке, т.е. "кмно кмно bbc bll dell dell" и поместите их в массив.

Однако я застрял в сравнении и нахождении подходящей анаграммы в массиве.

Любая помощь будет принята с благодарностью.

Ответы [ 15 ]

0 голосов
/ 19 января 2019

Вот мое решение, которое касается контрольного примера, в котором входные строки, которые не являются анаграммами, могут быть удалены из выходных данных. Следовательно, выходные данные содержат только строки анаграммы. Надеюсь, что это полезно.

/**
 * Anagram Finder
 * @params {array} wordArray
 * @return {object}
 */
function filterAnagram(wordArray) {
  let outHash = {};
  for ([index, word] of wordArray.entries()) {
    let w = word.split("").sort().join("");
    outHash[w] = !outHash[w] ? [word] : outHash[w].concat(word);
  }
  let filteredObject = Object.keys(outHash).reduce(function(r, e) {
    if (Object.values(outHash).filter(v => v.length > 1).includes(outHash[e])) r[e] = outHash[e]
    return r;
  }, {});

  return filteredObject;
}

console.log(filterAnagram(['monk', 'yzx','konm', 'aaa', 'ledl', 'bbc', 'cbb', 'dell', 'onkm']));
0 голосов
/ 11 марта 2018
var check=true;
var str="cleartrip";
var str1="tripclear";
if(str.length!=str1.length){
console.log("Not an anagram");

check=false;
}
console.log(str.split("").sort());
console.log("----------"+str.split("").sort().join(''));
if(check){
if((str.split("").sort().join(''))===((str1.split("").sort().join('')))){
console.log("Anagram")
}
else{
console.log("not a anagram");
}
}
0 голосов
/ 16 сентября 2017

Другое решение для isAnagram, использующее Reduce

const checkAnagram = (orig, test) => {
  return orig.length === test.length 
    && orig.split('').reduce(
      (acc, item) => {
        let index = acc.indexOf(item);
        if (index >= 0) {
          acc.splice(index, 1);
          return acc;
        }
        throw new Error('Not an anagram');
      },
      test.split('')
    ).length === 0;
};

const isAnagram = (tester, orig, test) => {
  try {
    return tester(orig, test);  
  } catch (e) {
    return false;
  }
}

console.log(isAnagram(checkAnagram, '867443', '473846'));
console.log(isAnagram(checkAnagram, '867443', '473846'));
console.log(isAnagram(checkAnagram, '867443', '475846'));
0 голосов
/ 08 декабря 2016

У меня есть простой пример

function isAnagram(strFirst, strSecond) {

 if(strFirst.length != strSecond.length)
       return false;

 var tempString1 = strFirst.toLowerCase();
 var tempString2 = strSecond.toLowerCase();

 var matched = true ;
 var cnt = 0;
 while(tempString1.length){
    if(tempString2.length < 1)
        break;
    if(tempString2.indexOf(tempString1[cnt]) > -1 )
        tempString2 = tempString2.replace(tempString1[cnt],'');
    else
        return false;

    cnt++;
 }

 return matched ;

 }

Функция вызова будет isAnagram("Army",Mary); Функция вернет true или false

0 голосов
/ 01 июня 2016
function isAnagram(str1, str2) {
  var str1 = str1.toLowerCase();
  var str2 = str2.toLowerCase();

  if (str1 === str2)
    return true;

  var dict = {};

  for(var i = 0; i < str1.length; i++) {
    if (dict[str1[i]])
      dict[str1[i]] = dict[str1[i]] + 1;
    else
      dict[str1[i]] = 1;
  }

  for(var j = 0; j < str2.length; j++) {
    if (dict[str2[j]])
      dict[str2[j]] = dict[str2[j]] - 1;
    else
      dict[str2[j]] = 1;
  }

  for (var key in dict) {
    if (dict[key] !== 0) 
      return false;
  }

  return true;
}

console.log(isAnagram("hello", "olleh"));
...