繁体   English   中英

字符串压缩

[英]String Compression

应通过用数字表示重复,将字符串列表压缩为最短的 forms。 如果一个字母只出现一次,那么它前面的"1"应该被省略。

例如

如果将"aabbaccc" aabbaccc”细分为 1 为单位,则可以将其压缩为"2a2ba3c"

"ababcdcdababcdcd" "2ab2cd2ab2cd"

如果细分为 3 为单位, "abcabcdede"可以压缩为"2abcdede" ,依此类推。

我需要将以下字符串压缩为以下最短长度

  1. "aabbaccc" ,7
  2. "ababcdcdababcdcd" ,9
  3. "abcabcdede" , 8
  4. "abcabcabcabcdededededede" , 14
  5. "xababcdcdababcdcd" ,17

我的代码仅适用于案例 1 和 5,因为我只知道如何将字符串细分为 1 的单位。我不确定如何细分大于 1 的单位,需要有人来编辑我的代码。

// traverse string, keep count of repeated chars
// if cur and next char is the same, inc count
// otherwise, concat cur char and count to output string, reset counter to 1
// return compressed string, only if the length is less than the original string, otherwise, return original string

let stringCompression = (s) => {
  let out = '';
  let count = 1;

  for (let i = 0; i < s.length; i++) {
    let cur = s[i];
    let next = s[i + 1];

    if (cur === next) {
      count++;
    } else {
      out += String(count) + cur;
      final = out.replace('1','')
      count = 1;
    }
  }
  return final.length < s.length ? final : s;
}
console.log(stringCompression('aabbaccc').length); // is 7

对于任何可以阅读韩语的人,原始来源是问题 1 from here

让我们将压缩部分称为块。 例如,在“ababcdcdababcdcd”(可以压缩为“2ab2cd2ab2cd”或“2ababcdcd”)中,“ab”、“cd”和“abcd”是块。 你可以写一个循环:

for(let i = N; i > ; i--)

其中N是块的最大可能长度(显然它是字符串的长度除以 2),而i是我们假设的当前块大小。 所以我们将开始寻找最大可能的块。 如果是“xababcddcdababcdcd”,则为:

  1. “xababcdc”
  2. "ababcdcd"
  3. ...每次你找到一个重复的块,你替换它

然而,还有另一条路。 我认为可以通过使用递归正则表达式来解决此任务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM