14. 获取字符串中连续最多的字符以及次数

43 阅读1分钟

题目

输入 '333dddd4444fffff234' 输出连续出现次数最多的,和出现的次数

解题思路1

使用双循环的方式。

string1.jpg

代码实现

interface strChar {
  char: string
  length: number
}

function findChar(str: string):strChar {
  const length = str.length
  const res: strChar = {
    char: '',
    length: 0
  }
  if (length===0) return res
  let midlength = 0
  for (let i=0;i<length;i++) {
    midlength = 0
    for (let j=i;j<length;j++) {
      if (str[i] === str[j]) {
        midlength++
      }
      if (str[i] != str[j] || j === length-1 ) {
        if (res.length < midlength) {
          res.char = str[i]
          res.length = midlength
        }
        if (i< length-1) {
          i = j-1
        }
        break
      }
    }
  }
  return res
}

上面代码中 使用了break 他会跳出当前层循环 想要 i=j 那么就要给他j-1 因为外面会给 i +1

复杂度分析

在这个双循环中, 因为外层循环中的i 是跟着J 跳着走的,所以,实际循环的次数就是字符串的长度 时间复杂度为O(n)

思路2 双指针

上面的嵌套循环也可以看作 两个指针, 一个是 i 一个是 j

代码实现

function findChar2(str: string): strChar {
  const length = str.length
  const res: strChar = {
    char: '',
    length: 0
  }
  if (length===0) return res
  let j=0
  let midlength = 0
  for (let i=0; i<= length; i++) {
    if (str[i] === str[j]) {
      midlength++
    }else {
      if (res.length < midlength) {
        res.char = str[j]
        res.length = midlength
      }
      midlength = 0
      j=i
      i--
    }
  }
  return res
}

复杂度分析

时间复杂度为O(n) 空间复杂度O(1)

其他方法

  1. 创建一个map 来记录每个字符串连续的次数,这样增加了空间复杂度O(n)。 时间复杂度 还是O(n), 不建议
  2. 算法中正则表达式的性能比较低