将一段压缩后的字符串解压,并且顺序输出

将一段压缩后的字符串解压,并且顺序输出。

算法描述:

解压规则:

        每个字符串后面跟着一个数字,表示这个字符重复的次数。

        例如:’a5’解压后为’aaaaa’, ‘abc3’解压后为’abcabcbac’

排序规则:

        根据字符串的重复次数升序排序;如:’a3b2’解压后为’bbaaa’2。

        如果字符串重复次数相同,根据ASCII做升序排序。如:’b2a2’解压后为’aabb’。

实现思路:

        我是看到这个问题,首先想到的是先把数字和英文分开,描述中还有排序规则,所以,最好能组装成键值关系,因为算法描述中,明确的说了数字可以相同,所以数字就不可以最为键,那只能是类似这样:[‘a’=>2],(没有说英文会相同,我们暂时定为没有重复。以下代码就是以没有重复写的)。

代码实现:

function str_unpack($str){
    $str_arr = preg_split("/([0-9]+)/", $str, -1, PREG_SPLIT_NO_EMPTY);
    $num_arr = preg_split("/([a-zA-Z]+)/", $str, -1, PREG_SPLIT_NO_EMPTY);
    $new_arr = array_combine($str_arr,$num_arr);
    ksort($new_arr);
    asort($new_arr);
    $str = '';
    foreach ($new_arr as $k =>$v) {
        $str.=str_repeat($k,$v);
    }
    return $str;
}

代码运行:

$input = 'a11b2bac3bad3abcd2cc4aa4';
echo str_unpack($input);

运行结果:

abcdabcdbbbacbacbacbadbadbadaaaaaaaaccccccccaaaaaaaaaaa

最后总结:

        代码中运用了PHP内置函数preg_split(),使用正则来切分字符串。目前还没有想到更好的方法,也希望看到此文章的大佬给出更好的方法。排序是用的按键排序的ksort()和按值排序的asort();具体不懂的可以访问PHP官方手册。

        还有要说的是这个是,这个算的前提是没有考虑会有重复的英文,有的话就不可以组成键值关系了,可以组成如下样式:

$arr = [
    '0'=>['11'=>'a'],
    '1'=>['2'=>'b'],
    '2'=>['3'=>'bac'],
];

        这样也是可以的,有兴趣的同学可以去试试。

个人做了一个博客,更多分享欢迎点击:www.caohongyuan.cn

欢迎指导!

千而の大狮子~

    原文作者:icaohongyuan
    原文地址: https://blog.csdn.net/hongyuancao/article/details/89157722
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞