Найти первые уникальные неанаграммные строки в массиве (JS) - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь найти первую уникальную строку в массиве, игнорируя все другие анаграммы, например:

let words = ['nap', 'teacher', 'cheaters', 'pan', 'ear',' эра ',' гектар '];

выход = дремать уши учителей

или let words = [' rat ',' tar ',' art '];

выход крысы

я застрял здесь

let set = new Set();
let words = let words = ['nap', 'teachers', 'cheaters', 'pan', 'ear', 'era', 'hectares']


let map = new Map();
for (let word of words) {
    let sorted = word.toLowerCase().split('').sort().join(''); 
    map.set(sorted, word);
    set.add(sorted)
}
let arr = Array.from(set)


for (let inx = 0; inx < words.length; inx++) {
    arr.push('0')
}
console.log(arr);
console.log(words);

function isAnagram(s1, s2){
    return s1.split("").sort().join("") === s2.split("").sort().join("");
  }

let result = [];

  for (let i = 0; i < words.length; i++) {
       if ()
       result.push(words[i])

}
console.log(result);

Ответы [ 5 ]

0 голосов
/ 08 ноября 2018

Еще одна реализация.:)

function aClean(arr) {
     var map = new Map();
     arr.map(item => {
         var key = item.toLowerCase().split("").sort().join("");
         map.has(key) ? null : map.set(key, item)
     });
    return Array.from(map.values());
}
0 голосов
/ 01 октября 2018

Благодаря user3297291 я нашел еще более простой вариант

let words = ['nap', 'teachers', 'cheaters', 'pan', 'ear', 'era', 'hectares']
const set = new Set();
const unique = [];

words.forEach((word) => {

 const sorted = word.split('').sort().join('');

 if (set.has(sorted)) {
   return;
 }
   unique.push(word);
   set.add(sorted);
 });

 print(unique.join(' '));
0 голосов
/ 01 октября 2018

Это должно сделать работу:

let words = ['nap', 'teachers', 'cheaters', 'pan', 'ear', 'era', 'hectares']

let map = new Map(
    words.reverse().map(word => {
        let sorted = word.toLowerCase().split('').sort().join(''); 
        return [sorted, word];
    })
);

console.log(Array.from(map.values())); // output: [ "teachers", "ear", "nap" ]

Использование символов каждого слова в качестве ключа.Например: для [учителя, мошенники, гектары] ключ «aceehrst»

, и поскольку порядок важен для нахождения первого, изменение порядка слов поможет сохранить «учителя» в качестве значения дляключ "aceehrst" вместо "га".

0 голосов
/ 01 октября 2018

Вместо Map из string: string, в котором вы сохраняете только последний вариант анаграммы, вы можете создать карту string: [ string ], в которой вы сохраните все параметры.

Затем, в концеВы можете перебрать все эти записи и вернуть первый элемент каждого массива:

let set = new Set();
let words = ['nap', 'teachers', 'cheaters', 'pan', 'ear', 'era', 'hectares']


let map = new Map();

for (let word of words) {
    let sorted = word.toLowerCase().split('').sort().join('');
    if (!map.has(sorted)) map.set(sorted, []);
    set.add(sorted);
    
    map.get(sorted).push(word);
}

let arr = Array
  .from(set)
  .map(k => map.get(k)[0])
  

console.log(arr);
0 голосов
/ 01 октября 2018

Вам необходимо проверить текущую позицию массива "words", а затем проверить остальные, это означает, что вам нужно иметь цикл внутри цикла, поэтому ваш код должен выглядеть следующим образом:

let set = new Set();
let words = ['nap', 'teachers', 'cheaters', 'pan', 'ear', 'era', 'hectares']


let map = new Map();
for (let word of words) {
    let sorted = word.toLowerCase().split('').sort().join(''); 
    map.set(sorted, word);
    set.add(sorted)
}
let arr = Array.from(set)


for (let inx = 0; inx < words.length; inx++) {
    arr.push('0')
}
console.log(arr);
console.log(words);

function isAnagram(s1, s2){
	console.log("checking: " + s1 + " and " + s2);
    return s1.split("").sort().join("") === s2.split("").sort().join("");
  }

let result = [];
let anagram = false;
  for (let i = 0; i < words.length; i++) {
	for(let j=i+1; j<words.length; j++){
			if (isAnagram(words[i], words[j])){
				anagram = true;	
				break;	
				console.log("Is anagram!");
			}
		}
	if(anagram)
    {
		//Before insert we will see if we have an anagram in the result array
		anagram = false;
		for(let z=0; z<result.length; z++)
    	{
			//We will se if it exists in result
			if(isAnagram(words[i],result[z]))
        	{
				anagram = true;
				break;
			}
		}
		if(!anagram)
        {
           	result.push(words[i]);
			anagram = false;
		}

	}
  }
       

console.log(result);
...