【Leetcode】Valid Parentheses

来源:互联网 发布:ffmpeg java api 编辑:程序博客网 时间:2024/06/01 13:29

题目:

Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]" are not.

分析:

本题考查的是栈结构,具有后进先出的特性。有效包含2个方面,第一个是如果是关闭的括号,前一位一定要刚好有一个开启的括号;第二个是最终结果,需要把所有开启的括号都抵消完。一个比较容易出错的地方是,遇到关闭括号时,要先判断栈是否已经空了。

Java版本一:

public class Solution {    public boolean isValid(String s) {        char[] charArr=s.toCharArray();        List<Character> list=new ArrayList<>();        for(Character c:charArr){            if(c=='('||c=='{'||c=='['){                list.add(c);            }else{                if(list.size()==0){                    return false;                }                char last=list.get(list.size()-1);                if(c==')'&&last!='('){                    return false;                }else if(c=='}'&&last!='{'){                    return false;                }else if(c==']'&&last!='['){                    return false;                }                list.remove(list.size()-1);            }        }        if(list.size()!=0){            return false;        }        return true;    }}
采用ArrayList数据结构,从开括号开始计算,list.size()==0就是用来保证第一个进入list集合的是开括号,last变量是用来取list集合中最后一个值,也就是取开括号的值,然后与后面输入的数组中c值进行匹配,(此处list实际就是用来保存开括号的字符,并当匹配成功后,对list集合进行清空,接着接收下一个开括号字符)匹配成功后,就在list集合中删除开括号的值,保证list集合为空,然后接着进行循环,接收开括号的字符值,再进行循环判断。

Java版本二:

public class Solution {    public boolean isValid(String s) {        Stack<Character> stack = new Stack<Character>();        // Iterate through string until empty        for(int i = 0; i<s.length(); i++) {            // Push any open parentheses onto stack            if(s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{')                stack.push(s.charAt(i));            // Check stack for corresponding closing parentheses, false if not valid            else if(s.charAt(i) == ')' && !stack.empty() && stack.peek() == '(')                stack.pop();            else if(s.charAt(i) == ']' && !stack.empty() && stack.peek() == '[')                stack.pop();            else if(s.charAt(i) == '}' && !stack.empty() && stack.peek() == '{')                stack.pop();            else                return false;        }        // return true if no open parentheses left in stack        return stack.empty();    }}
此处主要是应用了堆栈这个数据结构,后进先出,原理跟java(一)中类似,开括号进栈,匹配成功后出栈,保证栈这个数据结构为空,即全符合条件。


Python版本:

class Solution:    # @return a boolean    def isValid(self, s):        stack = []        dict = {"]":"[", "}":"{", ")":"("}        for char in s:            if char in dict.values():                stack.append(char)            elif char in dict.keys():                if stack == [] or dict[char] != stack.pop():                    return False            else:                return False        return stack == []

原理类似,就是用的dict字典型,直接在字典类型中进行配对,节省了判断条件的代码量。


C++版本:

#include <stack>class Solution {public:    bool isValid(string s) {        stack<char> paren;        for (char& c : s) {            switch (c) {                case '(':                 case '{':                 case '[': paren.push(c); break;                case ')': if (paren.empty() || paren.top()!='(') return false; else paren.pop(); break;                case '}': if (paren.empty() || paren.top()!='{') return false; else paren.pop(); break;                case ']': if (paren.empty() || paren.top()!='[') return false; else paren.pop(); break;                default: ; // pass            }        }        return paren.empty() ;    }};
C++主要运用的也是stack数据结构,独特点是通过switch进行配对。

原创粉丝点击