题目描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
看题解前自己的解决方案:
思路:
- 利用栈先进后出的特性来解决该问题
- 按字符逐个读取字符串,若是左括号就入栈,右括号就判断是否与在栈顶的左括号匹配,匹配的话就将栈顶左括号出栈,不匹配直接返回false,当将输入字符串遍历完时,若栈为空那么返回true,否则返回false
- 返回false的情况
- 1.左右括号不匹配
- 2.右括号入栈时栈为空
- 3.字符串遍历完后栈不为空
代码及其结果:
class Solution {
public int checkType(Character ch){// 判断输入字符是属于左括号还是右括号
if (ch.equals('(')|| ch.equals('[')||ch.equals('{'))
return 0;
else
return 1;
}
public boolean checkOk(Character c1,Character c2){ // 检测左右括号是否匹配
return c1.equals('(')&&c2.equals(')') || c1.equals('[')&&c2.equals(']')|| c1.equals('{')&& c2.equals('}');
}
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
int len = s.length();
char ch;
for (int i=0;i<len;i++){
ch = s.substring(i, i + 1).charAt(0);
if (checkType(ch)==0){
stack.push(ch);
}else{ // 若右括号入栈时栈为空 直接返回false
if (stack.size() == 0)
return false;
if (checkOk(stack.peek(),ch)){
stack.pop();
}else
return false;
}
}
// 若字符串遍历完 还有元素在栈内 那么则代表字符串不正确
return stack.isEmpty();
}
}
看题解后优化的代码:
优化思路:
- 相比于我之前的代码,该代码优化了判断字符左右类型和判断左右括号是否匹配的代码
- 在读取字符时,若是左括号字符,直接入栈对应的右括号字符,若读取的是右括号字符,判断栈空和字符与栈顶字符是否相等,满足则返回false
class Solution {
public boolean isValid(String s) {
Stack<Character>stack = new Stack<Character>();
for(char c: s.toCharArray()){
if(c=='(')stack.push(')');
else if(c=='[')stack.push(']');
else if(c=='{')stack.push('}');
else if(stack.isEmpty()||c!=stack.pop())return false;
}
return stack.isEmpty();
}
}