Пример привожу ниже
Write a method that can assert if a given string has valid parentheses order.
The parentheses are '(', ')', '{', '}', '[' and ']'.
isValid(‘[(yty)]’) => true
isValid(‘[(]’) => false
isValid(‘[a(fd)[}]’) => false
isValid(‘[{43}(yty)[{65}]]’) => true
т. е. не только что бы было четное количество открывающихся и закрывающихся скобок но что бы они были в правильном порядке. т. е. )( - это не правильный.
PHP
Здравствуйте, каким методом лучше проверять на PHP правильность открывающихся и закрывающихся скобок в строке?
Открывающаяся +1, закрывающаяся -1. В какой-то момент сумма станет отрицательной - ошибка, не равна в конце нулю - ошибка
Андрей !!!!
а как проверить такую )(?
if( assert(isValid('') === true) ) echo '1 - ok
';
if( assert(isValid('()') === true) ) echo '2 - ok
';
if( assert(isValid('{()}') === true) ) echo '3 - ok
';
if( assert(isValid('{()}{}') === true) ) echo '4 - ok
';
if( assert(isValid('(())') === true) ) echo '5 - ok
';
if( assert(isValid('{({({({()})})})}') === true) ) echo '6 - ok
';
if( assert(isValid('{(})') === false) ) echo '7 - ok
';
function isValid($str) {
$str = preg_replace('|[^{}()]|i', '', $str);
if ($str == '') {
return true;
}
$last = substr($str, -1);
$prelast = substr($str, -2, 1);
$first = substr($str, 0, 1);
if (checkBracket($prelast, $last)) {
$str = substr($str, 0, -2);
} elseif (checkBracket($first, $last)) {
$str = substr($str, 0, -1);
$str = substr($str, 1);
} else {
return false;
}
return isValid($str);
}
function checkBracket($one, $two) {
if ($one === "{" && $two === "}") {
return true;
} elseif ($one === "(" && $two === ")") {
return true;
} else {
return false;
}
}
На коленке накидал, потому могут быть косяки - проверишь. И возможно алгоритм можно придумать более оптимальный.
';
if( assert(isValid('()') === true) ) echo '2 - ok
';
if( assert(isValid('{()}') === true) ) echo '3 - ok
';
if( assert(isValid('{()}{}') === true) ) echo '4 - ok
';
if( assert(isValid('(())') === true) ) echo '5 - ok
';
if( assert(isValid('{({({({()})})})}') === true) ) echo '6 - ok
';
if( assert(isValid('{(})') === false) ) echo '7 - ok
';
function isValid($str) {
$str = preg_replace('|[^{}()]|i', '', $str);
if ($str == '') {
return true;
}
$last = substr($str, -1);
$prelast = substr($str, -2, 1);
$first = substr($str, 0, 1);
if (checkBracket($prelast, $last)) {
$str = substr($str, 0, -2);
} elseif (checkBracket($first, $last)) {
$str = substr($str, 0, -1);
$str = substr($str, 1);
} else {
return false;
}
return isValid($str);
}
function checkBracket($one, $two) {
if ($one === "{" && $two === "}") {
return true;
} elseif ($one === "(" && $two === ")") {
return true;
} else {
return false;
}
}
На коленке накидал, потому могут быть косяки - проверишь. И возможно алгоритм можно придумать более оптимальный.
Андрей !!!!
Спасибо а что должно быть тут - if ($str == '') перед закрывающей ковычкой?
Классическая задача решается с помощью стека. если открывающаяся - используешь array_push, если закрывающая - array_pop и проверяешь чтобы закрывающая соответствовала открывающей. Если не соответствует - неправильная последовательность, если в конце стек не пуст - опять таки неправильная.
Андрей !!!!
Не совсем понял как?
function checkParenthesis($string, array $type = ['(', ')']){
$length = srtlen($string);
$cnt = 0;
$open = type[0];
$close = type[1];
for($i = 0; $i < $length; ++$i){
$char = $string[$i];
if($char == $open) ++$cnt;
elseif($char == $close) --$cnt;
if($cnt < 0) break;
}
}
return $cnt == 0;
}
$length = srtlen($string);
$cnt = 0;
$open = type[0];
$close = type[1];
for($i = 0; $i < $length; ++$i){
$char = $string[$i];
if($char == $open) ++$cnt;
elseif($char == $close) --$cnt;
if($cnt < 0) break;
}
}
return $cnt == 0;
}
Андрей !!!!
Спасибо большое.
Андрей !!!!
тут в тайпе можно добавить 4 типа скобок? правильно?
Андрей !!!!
Странно но почему то выдает ошибку в 4-й строке syntax error, unexpected '[' in /var/www/html/p2/reznik.php on line 4
Андрей !!!!
кстати в этом варианте если мы встречаем сначало закрывающую скобку а потом открывающую система не остановит проверку и покажет что скобки правильные, потому, что она прибваит 1 потом отнимет а потом всерит не меньше нуля переменная а она уже будет = 0
Похожие вопросы
- PHP MYSQL после ввода запроса , отображается пустая строка перед 1 кой, немогу понять Помогите пожалуйста
- PHP. Почему нельзя применять функцию count() к строкам? Ведь строка это тот же массив
- Здравствуйте. Я в замешательстве. У меня php система, и я еле разобрался как заставить её работать, но теперь у меня...
- Передача json строки php to js
- как обычно через PHP закрывается или открывается доступ к заданным папкам и содержимому?
- Если в PHP нет перегрузки методов, то как же быть?
- Почему в качестве колбеков в PHP передаются методы (функции), а не объекты?
- PHP Polling ChatGPT
- Не работает PHP include на хостинге
- Изучаю php. В книжке дан код программы, объясните для чего строка? (код внутри)