Перестановка в JavaScript - PullRequest
       16

Перестановка в JavaScript

2 голосов
/ 16 марта 2019

Вот моя проблема:

Для данного предложения найдите вхождения данного набора символов.Выберите отфильтрованные слова и генерируйте перестановки.(НАЗНАЧЕНИЕ И СИМВОЛ НАБОР ТОЛЬКО МОЖЕТ ИМЕТЬ ВЕРХНИЕ БУКВЫ)

Показать выбранные слова и перестановки

Пример:

Входы

sentence = "THIS IS AN ISSUE FROM JOHN" 
word = "IS"

Вывод:

{ 
  words: ["THIS", "IS", "ISSUE"], 
  permutations: [["THIS","IS","ISSUE"], ["IS","THIS","ISSUE"], ["ISSUE","THIS","IS"], ["THIS","ISSUE","IS"], ["IS","ISSUE","THIS"], ["ISSUE","IS","THIS"]] 
}

И должны быть выполнены следующие критерии:

  1. Тип возвращаемого значения должен бытьобъект.

  2. getPermutations("THIS IS AN ISSUE FROM GIHAN", "IS")

    Должен возвращать:

    { 
      "word": ["THIS","IS","ISSUE"], 
      "permutations": [["THIS","IS","ISSUE"], ["IS","THIS","ISSUE"], ["ISSUE", "THIS", "IS"], ["THIS", "ISSUE", "IS"], ["IS", "ISSUE", "THIS"], ["ISSUE","IS","THIS"]]
    }
    
  3. Ответ должен быть действительным для любого заданного ввода.

Вот мой код:

function getPermutations(sentence, word) {
  var words = sentence.split(" ");
  var x = words[0] +" "+ words[1] +" "+ words[3];
  var inputArray = x.split(" ");
  var permutations = inputArray.reduce(function permute(res, item, key, arr) {
    return res.concat(arr.length > 1 && arr.slice(0, key).concat(arr.slice(key + 1)).reduce(permute, []).map(function(perm) { return [item].concat(perm); }) || item);

}, []);

  var output = { words: words,permutations :  permutations}; 


  return output;
}

console.log(getPermutations("THIS IS AN ISSUE FROM JOHN", "IS"));

есть какая-то ошибка, так что это путает с этим.Любое предложение, пожалуйста?

Ответы [ 3 ]

3 голосов
/ 16 марта 2019

Вы можете разделить слова на каждый пробел, а filter только те, которые содержат word.Тогда получите каждую перестановку из массива слов

function getPermutations(sentence, word) {
  const matches = sentence.split(" ").filter(w => w.includes(word));
  
  let permutations = permute(matches);
  
  return {
    word: matches,
    permutations
  }
}

/*
  https://stackoverflow.com/a/37580979/3082296
*/
function permute(permutation) {
  var length = permutation.length,
    result = [permutation.slice()],
    c = new Array(length).fill(0),
    i = 1,
    k, p;

  while (i < length) {
    if (c[i] < i) {
      k = i % 2 && c[i];
      p = permutation[i];
      permutation[i] = permutation[k];
      permutation[k] = p;
      ++c[i];
      i = 1;
      result.push(permutation.slice());
    } else {
      c[i] = 0;
      ++i;
    }
  }
  return result;
}

console.log(getPermutations("THIS IS AN ISSUE FROM GIHAN", "IS"))

Примечание. Если у вас есть слова, разделенные знаками препинания, такие как запятая (,) или точка (.), Используйте границы слов в регулярном выражении:

const matches = sentence.match(/\b(\w+)\b/g) 

Ссылка : Код перестановки элементов массива взят из этого ответа

0 голосов
/ 16 марта 2019

Используйте регулярные выражения (/\w*IS\w*/g) и match , чтобы извлечь слова, содержащие указанные вами символы.Используйте набор для удаления дубликатов, а затем сгенерируйте перестановки этого массива с уменьшение , квартира , карта и фильтр :

function permutations(arr) {
  return (arr.length === 1) ? arr : arr.reduce((acc, x, i) => {
    const remaining = [...new Set(arr)].filter((y, j) => i !== j);
    return [...acc, ...permutations(remaining).map(a => [x, a].flat())];
  }, []);
}

function getPermutations(str, word) {
  const words = [...new Set(
    (word && (str || '').match(new RegExp(`\\w*${word}\\w*`, 'g'))) || [])
  ];
  return { words, permutations: permutations(words) };
}

console.log(getPermutations('THIS IS AN ISSUE FROM JOHN', 'IS'));
console.log(getPermutations('THIS IS', 'IS'));
console.log(getPermutations('', 'IS'));
console.log(getPermutations(null, 'IS'));
console.log(getPermutations('', ''));
console.log(getPermutations('', null));
0 голосов
/ 16 марта 2019
function getPermutations(sentence,word) {        
    var pieces = sentence.split(" ");
    var valid_pcs = [];
    var combinations = [[]];
    var combinations_no_duplicates = [];
    for (var i = 0; i < pieces.length; i++) {
        if (pieces[i].indexOf(word) !== -1)
            valid_pcs.push(pieces[i]);
    }
    for (var i = 0; i < valid_pcs.length; i++) {
        tmp = [];
        for (var j = 0; j < combinations.length; j++) {
            for (var k = 0; k < valid_pcs.length; k++)
                tmp.push(combinations[j].concat(valid_pcs[k]));
        }
        combinations = tmp;
    }
    for (var i = 0; i < combinations.length; i++) {
        const distinct = [...new Set(combinations[i])];
        if (distinct.length == combinations[i].length)
            combinations_no_duplicates.push(combinations[i]);
    }
    return {"word":valid_pcs,"permutations":combinations_no_duplicates};
}

console.log(getPermutations("THIS IS AN ISSUE FROM JOHN", "IS"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...