Сейчас я пытаюсь решить задачу о поиске длины самой длинной подстроки, состоящей из одного и того же символа. Например, у меня есть строка yyuuufhvksoooo, тогда я получу результат 4.

Я написал этот код, вот он:

function longRepeat(line) {
  if (line.length > 0) {
    var count = 1;
    var max = 1;
  }
  for (let i = 0; i < line.length - 1; i++) {
    if (line[i] == line[i + 1]) {
      count++;
      if (count > max) max = count;
    } else {
      count = 1;
    }
  }
  return max;
}

Это работа. Но когда я тестирую этот код с большой строкой, фреймворк с сайта, где я нашел эту задачу, выдает мне ошибку You process has been killed because of using too much resources. Как я могу сделать мой код более эффективным?

-1
Dzianis Kurhan 27 Авг 2017 в 19:49

3 ответа

Лучший ответ

Вы можете использовать вложенный цикл со второй переменной j, чтобы двигаться вперед от текущей позиции i, пока не будет найден несовпадающий символ. Тогда, если разница между j и i больше максимальной, назначьте ее как максимальную.

Следующее значение i после каждой итерации становится значением j, так как оно уже проделало работу по продвижению как минимум на одну позицию.

function longRepeat(line) {
  if (!line.length) {
    return 0
  }
  var max = 1;
  for (let i = 0, j = 0; i < line.length - 1; i = j) {
    for (j = i + 1; j < line.length && line[j] == line[i]; j++) {
      // No more work to do here
    }

    if (j - i > max) {
      max = j - i;
    }
  }
  return max;
}

console.log(longRepeat("yyuuufhvksoooo"));

Проблема, на которую вы ссылаетесь в этом вопросе, неясна. Вы можете попробовать пакетный процесс, но трудно точно знать, каково решение этой проблемы без дополнительной информации.


Вот версия, которая выполняет меньше заданий и сравнений, что может быть немного более эффективным.

function longRepeat(line) {
  if (!line.length) {
    return 0
  }

  let max = 1;
  let i = 0;
  while (i < line.length-1) {
    const j = i;
    while (line[++i] == line[j]) {
      // No more work to do here
    }

    if (i - j > max) {
      max = i - j;
    }
  }
  return max;
}

console.log(longRepeat("yyuuufhvksoooo"));
1
spanky 27 Авг 2017 в 17:21

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

Идея состоит в том, что, когда у вас уже есть максимальная длина последовательности с одним и тем же символом, например, 10, вы можете перейти вперед с шагом 5, если символ, который вы там найдете, отличается от предыдущего. Вы можете сделать это, потому что нет способа вписать последовательность из 11 одинаковых символов, если вы знаете, что символы при каждом прыжке 5 разные.

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

Конечно, когда такой тест показывает, что персонаж один и тот же, вам все равно придется вернуться и проверить, какова на самом деле последовательность. Но это просто означает, что вы будете посещать символы, которых вы бы также посетили в принятом алгоритме. Так что там вряд ли есть потеря. Стоимость в дополнительном тесте "прыжок". В худшем случае вы будете находить один и тот же символ при каждом прыжке 5 и при этом обнаруживать, что последовательности того же символа больше нет. Но при случайном вводе, с 26 возможными символами на позицию (или более), более вероятно, что они различны, и что вы можете много прыгать.

Вот код:

function longRepeat(line) {
  if (!line.length) {
    return 0;
  }
  var max = 1, jump = 1, i, j, k, prev;
  for (i = 0, j = 0; i < line.length - 1; i = j) {
    prev = line[i];
    j = i + jump;
    if (line[j] !== prev) continue; // quick jump
    for (j = i + 1; j < line.length && line[j] === prev; j++) {
      // No more work to do here
    }
    for (k = i - 1; line[k] === prev; k--) { 
      // Looking backwards: no work either
    }
    if (j - k - 1 > max) {
      max = j - k - 1;
      jump = (max+1) >> 1;
    }
  }
  return max;
}

console.log(longRepeat("yyuuufhvksoooo"));
1
trincot 27 Авг 2017 в 22:59

Напишите функцию со встроенными функциями JavaScript

  • Соответствие регулярному выражению для соответствия подстроки того же символа и разбиения на массив
  • Сопоставьте массив и получите длину каждого слова
  • Найти максимальную длину слова
var findMaxLength = function(inputString){
		var arrChuncks = inputString.match(/(.)\1*/g);
		var arrChunkLengths = arrChuncks.map(function(i){return i.length})
		return Math.max.apply(null, arrChunkLengths)
}

var testString = "turpis venenatis porta. Maecenas et ultricies dui, ut accumsan metus. Duis ut odio at risus tincidunt scelerisque. Duis placerat efficitur posuere. Nam sit amet tincidunt purus. Maecenas urna nibh, imperdiet quis dui nec, congue maximus nisl. Vestibulum a magna pellentesque, ultricies libero id, porta lorem.Morbi eu ex mi. In pulvinar sit amet libero  felis.Pellentesque tellus dui, blandit vitae felis sed, rutrum volutpat tortor. Morbi consequat finibus leo quis porta. Aliquam varius ipsum in lorem varius mollis. Vivamus id ultricies tortor, sed rhoncus nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuerebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb cubilia Curae; Class aptent taciti sociosqu ad litora torquent per conubia nostra, ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccper inceptos himenaeos. Sed et massa in metus elementum sodales. Vestibulum id metus risus. Aliquam consequat at ante ut lobortis.Etiam vitae arcu et nisi laoreet gravida id id magna. Sed rutrum lacus ut enim vulputate facilisis. e platea dictumst. Donec rhoncus, ex at commodo volutpat, augue nulla rhoncus quam, ut pulvinar mi neque consectetur risus. Morbi tempor rhoncus mauris, sit amet tincidunt libero ultrices iaculis. Nulla erat dui, llis turpis non eros varius, mollis dictum neque vehicula. Aenean est felis, pellentesque non lectus vel, ultricies venenatis dui. Vivamus dictum lorem cursus hendrerit molestie. Aenean ornare  malesuada fames ac turpis egestas. Aliquam id bibendum turpis. Morbi in imperdiet elit.Sed in rhoncus purus. Nullam consequat nulla magna, in porttitor enim auctor feugiat. Nunc blandit, orci non vehicula malesuada, elit velit varius odio, id lobortis lectus purus in dui. Quisque massa nulla, convallis a mi vel, sagittis tincidunt lacus. ";

document.getElementById('output').innerHTML = findMaxLength(testString);
Max Length : 
<div id='output'></div>
0
Prashanth Thurairatnam 27 Авг 2017 в 19:16