Php 为什么这种支架平衡算法是错误的?

Php 为什么这种支架平衡算法是错误的?,php,Php,我编写了一个PHP函数,用于计算字符串是否包含正确数量的括号对。我测试了它,它工作正常,但我正在回答的网站说,这是错误的。帮我调试为什么 function bracketBalancer ($string) { for ($i=0; $i<strlen($string); $i++) { if ($string[$i] == '(') { $parentheses++; } elseif ($string[$i] == '{') { $cur

我编写了一个PHP函数,用于计算字符串是否包含正确数量的括号对。我测试了它,它工作正常,但我正在回答的网站说,这是错误的。帮我调试为什么

function bracketBalancer ($string) {
  for ($i=0; $i<strlen($string); $i++) {
    if ($string[$i] == '(') {
      $parentheses++;
    } elseif ($string[$i] == '{') {
        $curly++;
    } elseif ($string[$i] == '[') {
        $square++;
    } elseif ($string[$i] == ')') {
        $parentheses--;
    } elseif ($string[$i] == '}') {
        $curly--;
    } elseif ($string[$i] == ']') {
        $square--;
    }
  }
  if (!$parentheses && !$curly
      && !$square) {
     return true;
  }
  return false;
}
函数括号平衡器($string){

对于($i=0;$i)个人而言,我可能会使用一些内置的字符串函数与以下内容进行比较:

function bracketBalancer ($string)
{
    $ret=true;
    if(substr_count($string, '(') != substr_count($string, ')'))
    {
        echo "Parentheses don't match...\r\n";
        $ret=false;
    }
    if(substr_count($string, '{') != substr_count($string, '}'))
    {
        echo "Curlies don't match...\r\n";
        $ret=false;
    }
    if(substr_count($string, '[') != substr_count($string, ']'))
    {
        echo "Squares don't match...\r\n";
        $ret=false;
    }
    return $ret;
}
但正如我所说,有一百种方法可以编写做同样事情的代码

请注意,看看代码,它非常可怕,所以这里有一个更干净的函数:

<?php 
    function bracketBalancer ($string)
    {
        $match=array(
            'Parentheses' => array('(', ')'), 
            'Squares' => array('[', ']'),
            'Curlies' => array('{', '}')
             );
        $ret=true;
        foreach($match as $key=>$val)
        {
            if(substr_count($string, $val[0]) != substr_count($string, $val[1]))
            {
                echo $key." don't match.\r\n";
                $ret=false;
            }
        }
        return $ret;
    }

    $string='[{][)}[[}}[][))(())';
    echo (bracketBalancer($string))?"Everything matches nicely. Yay!":"Oh noes, there isn't matches!";
?>

您的答案无法检测括号是否正确嵌套
[(])
,或者括号是否按正确顺序出现
)(
)。以下操作应有效:

function bracketBalancer ($string) {
  $brkt = [];
  for ($i=0; $i<strlen($string); $i++) {
    if ($string[$i] == '(') {
      array_push($brkt, '(');
    } elseif ($string[$i] == '{') {
      array_push($brkt, '{');
    } elseif ($string[$i] == '[') {
      array_push($brkt, '[');
    } elseif ($string[$i] == ')') {
      if (empty($brkt)) {return false;}
      $c = array_pop($brkt);
      if ($c != '(') {return false;}
    } elseif ($string[$i] == '}') {
      if (empty($brkt)) {return false;}
      $c = array_pop($brkt);
      if ($c != '{') {return false;}
    } elseif ($string[$i] == ']') {
      if (empty($brkt)) {return false;}
      $c = array_pop($brkt);
      if ($c != '[') {return false;}
    }
  }
  if (empty($brkt)) {
    return true;
  }
  return false;
}
函数括号平衡器($string){
$brkt=[];

对于($i=0;$ii)来说,如果它工作正常,它就是正确的。编程总是有数百种方法来做同样的事情。有些更好,有些更糟——但不要仅仅因为某个网站告诉你这一点就坐在那里认为你错了。如果它工作正常,它就工作了。随着你获得更多的经验,你会发现自己编写代码的方式不同(希望随着您的进步而改进)这就是它的全部。只是一个提示:如果您将一个变量与多个值进行比较,大多数情况下,
开关
语句的可读性更好。只是想一想,您的答案不会检测到无效嵌套。即[xxx])。
$string='}][({';
@Sirko谢谢你的建议,我很感激!
function bracketBalancer ($string) {
  $brkt = [];
  for ($i=0; $i<strlen($string); $i++) {
    if ($string[$i] == '(') {
      array_push($brkt, '(');
    } elseif ($string[$i] == '{') {
      array_push($brkt, '{');
    } elseif ($string[$i] == '[') {
      array_push($brkt, '[');
    } elseif ($string[$i] == ')') {
      if (empty($brkt)) {return false;}
      $c = array_pop($brkt);
      if ($c != '(') {return false;}
    } elseif ($string[$i] == '}') {
      if (empty($brkt)) {return false;}
      $c = array_pop($brkt);
      if ($c != '{') {return false;}
    } elseif ($string[$i] == ']') {
      if (empty($brkt)) {return false;}
      $c = array_pop($brkt);
      if ($c != '[') {return false;}
    }
  }
  if (empty($brkt)) {
    return true;
  }
  return false;
}