次のような非常に長い整数シーケンスがあります (任意の長さ!):
0000000001110002220033333
今、この文字列を次のような圧縮されたものに変換するアルゴリズムが必要です
a9b3a3c3a2d5
これは、「a 9 回、次に b 3 回、次に a 3 回」という意味で、「a」は 0、「b」は 1、「c」は 2、「d」は 3 を表します。
どうやってそれをしますか?これまでのところ、適切なものは何も頭に浮かびませんでした。何を検索すればよいか本当にわからなかったので、Google ではうまくいきませんでした。この種のエンコード/圧縮は何と呼ばれますか?
PS: エンコーディングはPHPで、デコーディングはJavaScriptで行います。
編集:ありがとうございました!
私はエンコーディングのためにこの関数になりました:
protected function numStringToRle($s){
$rle = '';
$count = 1;
$len = strlen($s);
for($i = 0; $i < $len; $i++){
if($i != $len && isset($s[$i+1]) && $s[$i] == $s[$i+1]){
$count++;
} else {
$rle .= chr($s[$i] + 97).( $count == 1 ? '' : $count);
$count = 1;
}
}
return $rle;
}
そしてそれをデコードするため:
var decodeCoords = function(str) {
str = str.replace(/(.)(\d+)/g, function(_, x, n) {
return new Array(parseInt(n, 10) + 1).join(x);
});
return str.
replace(/a/g, '0').
replace(/b/g, '1').
replace(/c/g, '2').
replace(/d/g, '3');
};