字符串压缩(javascript)

3,723 阅读1分钟

题目

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

示例1:

输入:"aabcccccaaa" 输出:"a2b1c5a3" 示例2:

输入:"abbccd" 输出:"abbccd" 解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。 提示:

字符串长度在[0, 50000]范围内。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码

var compressString = function(S) {
  // 初始化一个最终的字符串结果
  let endString = ''
// 截取最后数字的正则
  let endNumberReg = /[0-9]*$/
// 截取最后数字和前一个字母的正则
  let endWordReg = /[a-zA-Z][0-9]*$/
  for(let i = 0; i < S.length; i++) {
    // 因为题目说最多50000个字符串,所以匹配最后一个字母加数字的时候,把之前的字符串全部干掉
    let matchWord = endString.substring(endString.length - 5, endString.length).match(endWordReg)
    // 如果相等就加1,不相等则等于1
    if (matchWord && matchWord[0][0] == S[i]) {
      let index = (matchWord[0].substring(1, matchWord[0].length)) ^ 0
      endString = endString.replace(endNumberReg, ++index)
    } else {
      endString += S[i] + '1'
    }
  // 题目说如果最终的字符串长度大于或者等于 初始的字符串长度就返回初始的
    if (endString.length >= S.length) {
      break;
    }
  }
  endString = endString.length >= S.length ? S : endString;
  return endString

};