Алгоритм поиска подстроки в массиве строк (Javascript)

82
12 июня 2021, 13:50

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

Т.е. допустим дан массив: let arr = ['aad','asad','adsd']; let sub = ['ad']; В результате выполнения функции необходимо получить 0, 1.

Сложность в том, что по условию задачи нельзя пользоваться стандартными функциями.

Answer 1

Без встроенных функций:

let arr = ['a@d', 'add', 'aadd', 'asad', 'test', 'adsd', 55555]; 
let str = 'ad'; 
 
/*****/ 
 
let indexList = []; 
for (let i = 0; i < arr.length; i++) { 
  if ( match(arr[i], str) ) { // совпало - true, не совпало - false 
    indexList[indexList.length] = i; 
  } 
} 
 
console.log(indexList); // Должно вывести [1, 2, 3, 5] 
 
/*****/ 
 
function match(str, sub) { 
  str = "" + str; 
  sub = "" + sub; 
  if (sub.length > str.length) { 
    return false; 
  } // Субстрока больше строки - сразу несовпадение. 
 
  let interval = str.length - sub.length + 1; 
  // строка из 3-х букв, субстрока из 2-х, значит нужно 2 проверки на полное совпадение 
  for (let i = 0; i < interval; i++) { 
    let match = 0;  
    for (let u = 0; u < sub.length; u++) { 
      if( str[i+u] !== sub[u] ){ // По очереди сравниваются все буквы. 
        break; 
      } else { 
        match++; 
      } 
    } 
    if( match === sub.length ){ return true; } 
  } 
  return false; 
}

Answer 2

Вариант со встроенными функциями, на случай, если у кого-то будет аналогичная задача, но без искусственных ограничений. :)

let arr = ['aad', 'abcd', 'adsd', 'da']; 
let str = 'ad'; 
 
let result = arr.map((item, i) => item.indexOf(str) >= 0 ? i : -1).filter(item => item >= 0); 
console.log(result);

Answer 3

В массив сохранять думаю удобнее всего, его уже можно обработать как надо.

let arr = ['ad','asad','adsd', 'ad']; 
let sub = ['ad'];
let res = [];
arr.forEach(function(elem) {
  if(elem == sub[0]) {
  res += '1';
  } else {
  res += '0';
  }
});
alert(res);

Мы просто сравниваем 0 элемент массива с сравниваемым массивом. Также можно в sub добавить несколько элементов, но для этого нужно дописать еще один if

READ ALSO
Почему не работает вызов функции переданной через props?

Почему не работает вызов функции переданной через props?

В родительском компоненте есть такая функция

98
Как из отформатированной даты, вернуть её обратно к moment

Как из отформатированной даты, вернуть её обратно к moment

Есть дата: moment()format('L') , как вернуть её обратно к moment? Если есть другие варианты, чтобы прибавить дни, они тоже подойдут, но пожалуйста, без парсинга...

102
Использовние __doPostBack в ASP.NET Web Forms приложении

Использовние __doPostBack в ASP.NET Web Forms приложении

Пробую использовать функцию __doPostBack, но выходит ошибкаНа стороне сервера у меня есть только page load

83