如何找到最长子串的长度?

时间:2018-10-23 18:07:16

标签: javascript

需要找到由相同字母组成的最长子字符串的长度。例如,“ aaabbcaaaa”行包含四个具有相同字母“ aaa”,“ bb”,“ c”和“ aaaa”的子字符串。

我找到了两种方法来做到这一点,但都不太好;

在第一种情况下,sdsffffse我不会在上面写类似的字母。 因为我只检查当前元素和第二个元素if(line[i] === line[i+1])

以第二种方式,当我尝试检查在该字符串aa中发现多少abababaab但我在对象中添加了所有a字母且长度= 5时,我失败了

function longRepeat(line) {
    let count = {};
  	let letter = [];
  for (let i=0; i<line.length; i++) {
  	count[line[i]] = i;
    if(line[i] === line[i+1]){
          letter.push([line[i], line[i+1]])
    }
  }

  
/*
second way
for (let x of line) {
    count[x] = ~~count[x] + 1;
 } */
  
  return letter;
}

console.log(longRepeat('sdsffffse')); f = 4
console.log(longRepeat('ddvvrwwwrggg')); = 3
console.log(longRepeat('abababaab')); // last two a = 2

3 个答案:

答案 0 :(得分:1)

可能的解决方案:

function longestSubstr(str) {
  if (!str) return 0
  let maxL = 1
  let curL = 1
  for (let i = 0; i < str.length - 1; i++) {
    let cur = str[i]
    let next = str[i + 1]
    if (cur === next) {
      curL++
    } else {
      if (maxL < curL) maxL = curL
      curL = 1
    }
  }
  if (maxL < curL) maxL = curL
  return maxL
}

console.log(longestSubstr("abababaab")) // 2

答案 1 :(得分:1)

如果您不介意使用正则表达式。

function func(line) {
  let reg = /(\w)\1+/g;
  let longest = line.match(reg).sort((a, b) => {
    a.length - b.length
  }).pop();
  console.log(line + ' : ' + longest);
}

func('ddvvrwwwrggg');
func('sdsffffse');
func('abababaab');
func('aaabbcaaaa');
func('aaaasdfbbbbyyyweryyyuurweuuuuuu');

/(\w)\1+/g将匹配一个相同字符的序列,使用match()方法,我们将获得所有序列,按长度对其进行排序,并获得数组中的最后一项,我不知道在长度相等的情况下该怎么办,所以我就丢给您,我只是在提出一个主意,这是您要改进的:)

答案 2 :(得分:0)

#python
def long_repeat(line):
    line = line.lower()
    max = 1
    if len(line) == 0:
        return 0
    for i in range(0, len(line) - 1):
        count = 1
        while line[i] == line[i + 1]:
            count += 1
            if max < count:
                max = count
            if i < len(line) - 2:
                i += 1
            else:
                break
    return max