首页 > 解决方案 > 如何使用字符串操作解决“解码字符串问题”?

问题描述

我遇到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;

有什么方法可以使用这种方法或其他方法来解决它。还是只能使用堆栈来解决?感谢您的任何想法可以帮助解决这个问题!

标签: phparraysstringalgorithmstack

解决方案


要解决嵌套[],你必须从内到外解码。该解决方案使用 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

推荐阅读