20.有效的括号
- 给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串s
,判断字符串是否有效。 - 有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
括号匹配
利用 栈 的特性(先进后出)来求解问题,遇到左括号就入栈,遇到右括号就去栈中寻找最近的左括号,看是否匹配。
我平时使用vector<T>
比较多,所以我使用 vector容器来模拟 栈 的效果。
代码实现
private:
//将右括号转化为相对应的左括号,用于进行匹配
char rightToLeft(char c) {
if (c == ')') return '(';
if (c == '}') return '{';
else { return '['; }
}
public:
bool isValid(string s) {
int nStrLength = s.size();
vector<char> vLeft;
for (int i = 0; i < nStrLength; i++) {
if (s[i] == '(' || s[i] == '{' || s[i] == '[') {
vLeft.push_back(s[i]); //遇到左括号就插入vector中
}
else {
char cRtoL = rightToLeft(s[i]);
//vLeft.size() == 0这个判断是防止出现类似"(){}]"的形式,避免读取到右括号时,没有左括号来进行配对
if (vLeft.size() != 0 && cRtoL == vLeft.back())
{
vLeft.pop_back(); //右括号匹配vector最后一个元素的左括号就移除该左括号
}
else {
return false;
}
}
}
//if(vLeft.size()==0) //这个判断是防止出现类似"(){"的形式,避免有多余的左括号
// return true;
//else {
// return false;
//}
return vLeft.empty(); //一句顶上面四句,还要努力呀
}
时间复杂度: O ( n ) O(n) O(n),空间复杂度: O ( n ) O(n) O(n)
LeetCode提交结果:执行用时:0ms;内存消耗:6.1MB