如何找到由相同char组成的最长子字符串?

时间:2017-08-27 16:49:20

标签: javascript string algorithm

现在我尝试解决有关查找长度最长子串的任务,该子串由相同的char组成。例如,我有一个字符串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。 如何使我的代码更有效?

3 个答案:

答案 0 :(得分:1)

您可以使用带有第二个变量j的嵌套循环从当前i位置向前移动,直到找到不匹配的字符。然后,如果ji之间的差异大于最大值,请将其指定为最大值。

每次迭代后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 :(得分:1)

我意识到你已经接受了答案,但是对于非常大的字符串,可能仍有改进空间,平均而言,你可以期望具有相同字符的范围变得更长。

这个想法是,当你已经有一个相同字符序列的最大长度(例如10)时,只要你在那里找到的字符与前一个字符不同,就可以向前跳5步。你可以这样做,因为当你知道每次跳跃5的角色不同时,就无法适应11个相同角色的序列。

在随机的长输入字符串中,这可能意味着您可以通过这种方式跳过很多字符。

当然,当这样的测试表明角色是相同的时候,你仍然需要回去查看序列到底有多长。但这只是意味着您将访问您在已接受的算法中访问过的角色。所以那里几乎没有损失。成本是额外的&#34;跳跃&#34;测试。在最坏的情况下,你会在每次跳跃5时找到相同的角色,并且仍然发现不再有相同角色的序列。但是随机输入,每个位置有26个可能的字符(或更多),它们更有可能是不同的,你可以跳得很多。

以下是代码:

&#13;
&#13;
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"));
&#13;
&#13;
&#13;

答案 2 :(得分:0)

使用内置的javascript功能编写一个函数

  • 正则表达式匹配以匹配相同字符串的子字符串分裂成数组
  • 映射数组并获取每个单词的长度
  • 查找字长的最大值

&#13;
&#13;
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);
&#13;
Max Length : 
<div id='output'></div>
&#13;
&#13;
&#13;