问题:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
解法:
一、栈法
创建一个对等的数组
[
'('=>')',
'{'=>'}',
'['=>']'
]
如果值是左边的,那么将对应的右边存入栈中
如果值不是左边的,那么弹出栈,看值是否一致,一致则下一步,否则直接返回false
如果没有值再传入,那么判断栈是否还有内容,有则false,没有则true
class Solution
{
/**
* @param String $s
* @return Boolean
*/
function isValid($str)
{
$i = 0;
$inn = [];
$brackets = [
'(' => ')',
'{' => '}',
'[' => ']'
];
while (true) {
//字符串输出结束
if (!isset($str[$i])) {
//如果栈中还有数据,代表错误
return empty($inn);
}
//如果值是左边的,那么将对应的右边存入栈中
if (isset($brackets[$str[$i]])) {
array_push($inn, $brackets[$str[$i]]);
} else {
//如果值不是左边的,那么弹出栈,看值是否一致,一致则下一步,否则直接返回false
if ($str[$i] !== array_pop($inn)) {
return false;
}
}
$i++;
}
return false;
}
}
二、 消消乐法
将直接成对了的括号()
、{}
、()
给剔除掉,如果最终已经没有可以剔除的字符串,那么判断是否还有剩余未剔除的括号,有的话则代表false。
这里重点用到了方法
str_replace(mixed $search , mixed $replace, mixed $subject [, int &$count])
其中,$count
参数时进行字符串替换后,所成功进行替换的次数。利用它,即可判断是否有成功替换字符串(是否已经没有可以剔除的字符串)。
class Solution
{
/**
* @param String $s
* @return Boolean
*/
function isValid($str)
{
while (true) {
//直接剔除当前字符串中成对的括号
$str = str_replace(['()', '[]', '{}'], '', $str, $count);
//已经没有可替换的符号
if ($count === 0) {
//判断最终是否有剩余符号
return strlen($str) === 0;
}
//可能还存在可替换的符号,继续循环
}
}
}