[英]String Compression
应通过用数字表示重复,将字符串列表压缩为最短的 forms。 如果一个字母只出现一次,那么它前面的"1"
应该被省略。
例如
如果将"aabbaccc"
aabbaccc”细分为 1 为单位,则可以将其压缩为"2a2ba3c"
。
"ababcdcdababcdcd"
"2ab2cd2ab2cd"
。
如果细分为 3 为单位, "abcabcdede"
可以压缩为"2abcdede"
,依此类推。
我需要将以下字符串压缩为以下最短长度
"aabbaccc"
,7"ababcdcdababcdcd"
,9"abcabcdede"
, 8"abcabcabcabcdededededede"
, 14"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”,则为:
然而,还有另一条路。 我认为可以通过使用递归正则表达式来解决此任务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.