字符串压缩算法实现

根据字符重复次数压缩字符串,如 aabcccccaaa 压缩为 a2b1c5a3

问题

实现一个字符串压缩函数,将连续重复的字符用”字符+出现次数”的形式表示。例如,字符串 aabcccccaaa 压缩为 a2b1c5a3

解答

function compressString(str) {
  if (!str) return str;
  
  let compressed = '';
  let count = 1;

  for (let i = 0; i < str.length; i++) {
    if (str[i] === str[i + 1]) {
      // 当前字符与下一个字符相同,计数加1
      count++;
    } else {
      // 字符不同或到达末尾,将字符和计数追加到结果
      compressed += str[i] + count;
      count = 1; // 重置计数器
    }
  }

  // 返回较短的字符串
  return compressed.length < str.length ? compressed : str;
}

// 测试
console.log(compressString('aabcccccaaa')); // 'a2b1c5a3'
console.log(compressString('abc'));          // 'abc' (压缩后更长,返回原串)

关键点

  • 遍历字符串时比较当前字符与下一个字符,相同则累加计数
  • 遇到不同字符或到达末尾时,将”字符+计数”追加到结果
  • 压缩后的字符串可能比原串更长,需要比较长度返回较短的
  • 边界情况:空字符串直接返回