лучший способ проверить наличие комбинации элементов в массиве в машинописном тексте

У меня есть массив с некоторым элементом, который я хочу проверить, существует ли какая-либо комбинация элементов в массиве, за которым целевой элемент следует любым элементом checkSet, если да, то верните true, в противном случае верните false. Например, если inputArray равен ['a', 'b', 'c', 'd'], а поиск комбинации - ['a', 'd'], тогда он должен вернуть true, потому что inputArray имеет оба в правильной последовательности. . если inputArray равен ['d', 'b', 'c', 'd', 'a'], а комбинация - ['a', 'd'], тогда оно должно быть ложным, потому что inputArray включает оба элемента, но в неправильный порядок или

      isExist(['a', 'd']) => true 
isExist(['a', 'a', 'd']) => true
isExist(['e', 'd']) => false

Я могу использовать цикл Set и while, но мне интересно, есть ли более элегантный или современный способ?

      export function isExist(checkArray): boolean {
  let hasA = false;
  let hasB = false;
  checkingSet = new Set(['b', 'c', 'd'])
  const target = 'a'
  inputArray = [...checkArray]
  while (inputArray && !!inputArray.length) {
    const lastOne = inputArray.pop();
    if (!hasA && !!lastOne) {
      hasA = chekcingSet.has(lastOne);
    }
    if (!hasB && !!lastOne) {
      hasB = lastOne === target;
    }
    if (hasA && hasB) {
      return true;
    }
  }
  return false;
}

2 ответа

Чтобы проверить, что массив содержит, и после этого хотя бы один из них находится в массиве, вы можете сделать это. Сначала получите первого 'a'в массиве, затем проверьте, есть ли индекскакое-то значение ['b', 'c', 'd']будет включен в этом массиве после этого начального индекса.

Это общая версия, она O(n).

      function doesDupleExistInOrder([el1, el2], arr) {
    let index = arr.indexOf(el1)
    if (index == -1) return false;
    return arr.includes(el2, index + 1)
}

console.log(doesDupleExistInOrder(["a", "d"], ["a", "b", "c", "d", "e"])); // true
console.log(doesDupleExistInOrder(["a", "b"], ["a", "b", "c", "d", "e"])); // true
console.log(doesDupleExistInOrder(["d", "e"], ["a", "b", "c", "d", "e"])); // true

console.log(doesDupleExistInOrder(["d", "a"], ["a", "b", "c", "d", "e"])); // false
console.log(doesDupleExistInOrder(["d", "a"], ["a"]));                     // false
console.log(doesDupleExistInOrder(["d", "a"], []));                        // false

Если вам нужна конкретная версия, просто выполните общую функцию AKA:

      let doesADExist = arr => doesDupleExistInOrder(["a", "d"], arr);
console.log(doesADExist(["a", "b", "c", "d", "e"]));  // true
Другие вопросы по тегам