逛了这么多年CSDN,以前老觉得没时间,麻烦,就不愿意写博客(自己也不太会,不想花时间琢磨),今天参加完程序设计大赛,想着每天刷两题LeetCode,顺便做一个学习之旅的心路历程。
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
Hint:
原思路:创建一个栈,先把所有左括号入栈,每到遇到一个相同的右括号就出栈,向后遍历字符串。未果,写有点复杂,不知道为什么后面的左括号都不入栈了。。。
优化思路:每遇到一个左括号,入栈一个相同的右括号,遇到右括号就比较是否一致,一致就弹出,遇到栈空了,字符不一样说明不合法。
自己写了一个很复杂的栈,学习了别人之后,简化了一下自己的;
class Solution {
public:
bool isValid(string s) {
stack<int> st;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') st.push(')');
else if (s[i] == '{') st.push('}');
else if (s[i] == '[') st.push(']');
// 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
// 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
else if (st.empty() || st.top() != s[i]) return false;
else st.pop(); // st.top() 与 s[i]相等,栈弹出元素
}
// 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
return st.empty();
}
};
看到了别人的一个新鲜写法:
class Solution {
public boolean isValid(String s) {
int length = s.length() / 2;
for (int i = 0; i < length; i++) {
s = s.replace("()", "").replace("{}", "").replace("[]", "");
}
return s.length() == 0;
}
}