如何不使用正则表达式统计字符串连续相同字符并输出压缩结果
实现方案
思路说明
- 仅需一次遍历字符串即可完成统计,时间复杂度O(n),空间复杂度O(1)(不计输出结果的存储空间)
- 维护两个临时变量:
currentChar存储当前统计的连续字符,count存储当前字符的连续出现次数 - 遇到和
currentChar不同的字符时,将已统计的字符和次数写入结果,重置临时变量即可 - 无需将字符串转为数组,直接通过索引访问字符串字符即可
完整可运行代码
function countContinuousChar(str) { // 空字符串直接返回 if (!str) return '' let result = '' let currentChar = str[0] let count = 1 // 从第二个字符开始遍历 for (let i = 1; i < str.length; i++) { if (str[i] === currentChar) { count++ } else { // 拼接上一组统计结果 result += `${currentChar}${count}` // 重置临时变量 currentChar = str[i] count = 1 } } // 遍历结束后拼接最后一组的结果 result += `${currentChar}${count}` return result } console.log(countContinuousChar('dddmmmmccccaaamm')) // 输出 d3m4c4a3m2
原代码问题说明
原有代码使用indexOf查找字符位置的逻辑不适用本需求:indexOf会查找字符在整个数组中所有出现的位置,无法区分是否是连续出现的,比如字符串末尾的m会被识别为和开头d之后的m是同一组,无法实现分连续段统计的效果。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

