【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进行配对。
阅读全文
0 0
- LeetCode: Valid Parentheses
- LeetCode: Longest Valid Parentheses
- LeetCode: Valid Parentheses
- LeetCode Longest Valid Parentheses
- [Leetcode] Valid Parentheses
- LeetCode: Longest Valid Parentheses
- [Leetcode] Longest Valid Parentheses
- LeetCode : Valid Parentheses
- [leetcode]longest Valid Parentheses(!!)
- Leetcode: Valid Parentheses
- leetcode 52: valid parentheses
- [Leetcode] Longest Valid Parentheses
- leetcode Longest Valid Parentheses
- 【leetcode】Valid Parentheses
- 【leetcode】Longest Valid Parentheses
- [LeetCode]Longest Valid Parentheses
- [LeetCode]Valid Parentheses
- LeetCode-Valid Parentheses
- mysql数据库清空密码
- 响应式html
- ThreadLocal原理(阿里巴巴)
- MySQL 基础知识
- NOIP模拟(11.02)T2 最佳序列
- 【Leetcode】Valid Parentheses
- 接口
- centos tftp 服务端配置手册
- 【笔记】android录音权限遇到的问题和兼容8.0权限请求的方案
- git使用
- H5各种头部meta标签功能大全
- 从文件系统读取数组(Objective-C 开发范例)
- java作业
- Ubifs文件系统和mkfs.ubifs以及ubinize工具的用法