将一段压缩后的字符串解压,并且顺序输出。
算法描述:
解压规则:
每个字符串后面跟着一个数字,表示这个字符重复的次数。
例如:’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
欢迎指导!
千而の大狮子~