找出字符串中连续出现最多的字符和个数(蘑菇街)

947 阅读1分钟

好久没有写分享了,上周看到了这道题,本来以为很简单,心算了一下居然没算出来。今天找了点时间把它折腾出来了,不知道性能怎么样,欢迎小伙伴们指正。 先来分析一下题目:可以看出,要求找出重复次数最多字符和个数,而且是连续出现的。这样的话,貌似一次遍历并不能得出结论。于是,我用一个递归,把字符串按连续出现的字符为单位,裁成一小段一小段。将这些小段字符串用数组保存起来,按字符长度进行排序,找出最长字符串即可。话不多说,上代码

function pickChar (str) {
  // 防止传入空串
  if (str.length === 0) return
  const arr = [] // 保存裁剪出来的短字符串
  const result = {} // 计算结果
  splitStr(str, 0, arr) // 裁剪结果对象
  arr.sort((a, b) => {return b.length - a.length}) // 对短字符串进行排序
  let len = arr[0].length
  // 找出最长字符串
  arr.forEach(i => {
    if (i.length === len && !result[i[0]]) {
      result[i[0]] = i.length
    }
  })
  return result

  /*
   * 裁剪函数
   * 接受两个参数: str(需要裁剪的字符串),index(目前遍历到的索引)
   * 如果当前字符与后一字符相同,就将索引往后移动一位;如果不同,就在当前索引处将字符串裁切,取得从开头到当前索引的 * 字符串并开始遍历剩下的字符串,知道字符串全部裁切完
   */
  function splitStr (str, index) {
    // 裁剪完成,结束递归
    if (str.length === 0) return
    if (str.length === 1) {
      arr.push(str[0])
      str = ''
      return
    }

    if (str[index] !== str[index+1]) {
      arr.push(str.substr(0, index + 1))
      splitStr(str.substr(index + 1), 0, arr)
    } else {
      index++
      splitStr(str, index, arr)
    }
  }
}

看看结果

实现不好之处,还望各位小伙伴不吝赐教