0.题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
举例:
1.题目分析
拿到这道题首先想到的是利用栈,这也是括号问题的经典解法。思路是:
(0).若字符串为空,返回true
(1).首先在栈底放入一个元素‘s’,在字符串末尾放一个相同的元素's'。这样做可以防止栈.top()时报错,可以防止这种情况:假如s[0]就为“'[”,这时候若栈里面为空,比较s[0]和.top时,会报错。
(1).从左边起遍历括号
(2).遇到左括号进栈
(3).此时遇到的元素若是与栈顶元素不匹配,则遍历结束,返回false。
(4).此时遇到的元素若是与栈顶元素匹配,则让栈顶元素出栈,同时不管这个此时的右括号,继续遍历。
(5).若遍历结束,这时候栈也为空,则返回true
2.栈的基本用法
在C++中,使用标准库的栈时, 应包含相关头文件,在栈中应包含头文件: #include< stack > 。定义:stack< int > s;
常见的用法:
s.empty(); //如果栈为空则返回true, 否则返回false;
s.size(); //返回栈中元素的个数
s.top(); //返回栈顶元素, 但不删除该元素
s.pop(); //弹出栈顶元素, 但不返回其值
s.push(); //将元素压入栈顶
3.代码
这道题解法代码如下:
class Solution {
public:
bool isValid(string s) {
stack<char> bracket;
s = s + 's';
map<char, int> hash;
hash['s'] = 0;
hash['('] = 1;
hash[')'] = 1;
hash['['] = 2;
hash[']'] = 2;
hash['{'] = 3;
hash['}'] = 3;
if (s.length() > 0)
{
bracket.push('s');
for (int i = 0; i < s.length(); i++)
{
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
{
bracket.push(s[i]);
}
else if (hash[s[i]]==hash[bracket.top()]) //匹配
{
bracket.pop();
}
else
{
return 0;
}
}
if (bracket.empty())
{
return 1;
}
else //遍历结束后栈不为空
return 0;
}
else
return 1; //输入的s是空字符串
}
};
用时:
代码有一次遍历,每次遍历处理的内容是常数时间复杂度,所以整体时间复杂度为O(n)。