编码/压缩重复整数的序列

Ale*_*lex 8 javascript php compression encode sequence

我有很长的整数序列,看起来像这样(任意长度!):

0000000001110002220033333
Run Code Online (Sandbox Code Playgroud)

现在我需要一些算法来将这个字符串转换成压缩的东西

a9b3a3c3a2d5
Run Code Online (Sandbox Code Playgroud)

这意味着"9次,然后b 3次,然后是3次"等等,其中"a"代表0,"b"代表1,"c"代表2,"d"代表3.

你会怎么做?到目前为止,没有任何合适的东西出现在我的脑海里,而且谷歌没有运气,因为我真的不知道该搜索什么.这种编码/压缩叫什么?

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;            
}
Run Code Online (Sandbox Code Playgroud)

那用于解码:

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');     
};
Run Code Online (Sandbox Code Playgroud)

Yac*_*oby 7

它被称为运行长度编码

PHP中的基本编码器:

function numStringToRle($s){
    $rle = '';
    $count = 1;
    $len = strlen($s);
    for ( $i = 0; $i < $len; $i++ ){
        if ( $i != $len && $s[$i] == $s[$i+1] ){
            $count++;                
        }else{
          $rle .= chr($s[$i] + 97).$count;    
          $count = 1;
        }
    }
    return $rle;
}
Run Code Online (Sandbox Code Playgroud)

请注意,它会像字符串一样预先形成严重的问题

 123456789123456789
Run Code Online (Sandbox Code Playgroud)

如果您要处理可能包含大量单个字符的字符串,则最好添加一些复杂性,如果运行的长度为1,则不要写入运行的长度.

//change
$rle .= chr($s[$i] + 97).$count;    

//to
$rle .= chr($s[$i] + 97).( $count == 1 ? '' : $count );   

//or
$rle .= chr($s[$i] + 97)
if ( $count != 1 ){
    $rle .= $count;
}
Run Code Online (Sandbox Code Playgroud)