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