php - 如何使用字符串操作解决“解码字符串问题”?
问题描述
我遇到Decode string problem
了一个编码字符串 s,用 rule: 解码它
N[encoded] => encoded*N
。
例子:
$input = "4[abc]";
// output: abcabcabcabc
$input = "ac3[ab]d";
// output: acabababd
$input = "a2[b3[cd]]";
// output: abcdcdcdbcdcdcd
我已经尝试使用带有 if 条件的字符串操作来解决它,它仅适用于两个输入,但是当给定的输入具有多个编码字符串时,它最后一个失败。
$output = '';
$arr = str_split($input);
for ($i=0; $i < count($arr); $i++) {
$char = $arr[$i];//current character
if($char == '['){
$closed = strpos($input, ']');
$len = $closed - ($i+1);
$output .= str_repeat(substr($input, $i+1, $len), $prev);
$i = strpos($input, ']');
}elseif(ctype_digit($char)){
$prev = $char;
}else{
$output .= $char;
}
}
echo $output;
有什么方法可以使用这种方法或其他方法来解决它。还是只能使用堆栈来解决?感谢您的任何想法可以帮助解决这个问题!
解决方案
要解决嵌套[],你必须从内到外解码。该解决方案使用 preg_replace_callback 直到没有任何东西可以替换。
function fkdecode($str){
while(true){
$newStr = preg_replace_callback('~(\d+)\[([^\[\]]+)\]~',
function($m){
return str_repeat($m[2],(int)$m[1]);
},
$str);
if($newStr == $str) break;
$str = $newStr;
}
return $str;
}
//test
$inputs = ["4[abc]", // output: abcabcabcabc
"ac3[ab]d", // output: acabababd
"a2[b3[cd]]", // output: abcdcdcdbcdcdcd
];
foreach($inputs as $input){
echo $input.' := '. fkdecode($input)."<br>\n";
}
输出:
4[abc] := abcabcabcabc
ac3[ab]d := acabababd
a2[b3[cd]] := abcdcdcdbcdcdcd
推荐阅读
- perl - 用于 HTML 的 Perl 多字节字符编码
- javascript - (React)仅在满足条件时如何渲染组件
- c - 如何释放我使用的指针?使用后是否可以释放指针?
- python - 结果值存储在数组或 json 中
- laravel - laravel 我正在制作一个基于网络的提醒系统,可以在短信中发送消息
- python - 将来自rest api的JSON提取传递给python中的SQL Server
- javascript - 我如何在 Javascript 中使用 Bind
- jquery - Jquery 样式和颜色
- java - 使用 @Qualifier 指定的 bean 注入点时如何扩展命名的 Spring bean?
- apache - MAMP:Apache 服务器在 Windows 10 中自动关闭