leetcode腾讯精选练习50(11)——有效的括号
题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法思路
运用栈的思想,将左边的符号入栈,因为不仅要正确的配对还要顺序正确,所以出现第一个右边符号时,如果字符串有效,则栈顶元素是正好与之配对的,依次类推。
代码
//Java的两种实现
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
char[] s1 = s.toCharArray();
for(char c:s1){
if(stack.size()==0){
stack.push(c);
}else if(isRight(stack.peek(),c)){
stack.pop();
}else{
stack.push(c);
}
}
return stack.size()==0;
}
public boolean isRight(char c1,char c2){
return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}');
}
}
class Solution {
private static final Map<Character,Character> map = new HashMap<Character,Character>(){{
put('{','}'); put('[',']'); put('(',')'); put('?','?');
}};
public boolean isValid(String s) {
if(s.length() > 0 && !map.containsKey(s.charAt(0))) return false;
LinkedList<Character> stack = new LinkedList<Character>() {{ add('?'); }};
for(Character c : s.toCharArray()){
if(map.containsKey(c)) stack.addLast(c);
else if(map.get(stack.removeLast()) != c) return false;
}
return stack.size() == 1;
}
}
C语言实现,大佬说0ms,亲测4ms和0ms徘徊。
bool isValid(char * s){
if (s == NULL || s[0] == '\0') return true;
char stack[10240]; int top =0;
for (int i = 0; s[i]; ++i) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') stack[top++] = s[i];
else {
if ((--top) < 0) return false;//先减减,让top指向栈顶元素
if (s[i] == ')' && stack[top] != '(') return false;
if (s[i] == ']' && stack[top] != '[') return false;
if (s[i] == '}' && stack[top] != '{') return false;
}
}
return (top ? false : true);//防止“【”这种类似情况
}