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.
这道题就是判断括号的配对的正确与否,使用stack即可解决。主要思路如下:遍历字符串即可, 1)遇到左括号,直接入栈; 2)遇到右括号,判断右括号与栈顶元素是否配对; a) 假如不配对,表示整体不配对; b) 假如配对,出栈。 3)遍历结束的时候,假如栈不空,表示不配对,否者配对成功。
建议和leetcode 32. Longest Valid Parentheses 最长有效括号长度和 leetcode 678. Valid Parenthesis String 有效括号的判断 一起学习
代码如下:
import java.util.ArrayList; import java.util.List; public class Solution { public boolean isValid(String s) { boolean res=true; if(s==null || s.length()<=0) return res; if(s.length()%2==1) return false; List<Character> stack=new ArrayList<Character>(); for(int i=0;i<s.length();i++) { char n=s.charAt(i); if(n=='(' || n=='[' || n=='{') stack.add(n); else if(n==')' || n==']' || n=='}') { if(stack.isEmpty()) { //第一个字符就是闭合字符,比如] } ) res=false; break; } if(stack.get(stack.size()-1)==getDui(n)) stack.remove(stack.size()-1); else { //匹配错误 res=false; break; } } else { //出现了不该出现的字符 res=false; break; } } //stack不为空必然就是不匹配,比如 (( if(res==true && stack.size()>0) res=false; return res; } private Character getDui(char n) { char res=' '; switch (n) { case ')': res='('; break; case ']': res='['; break; case '}': res='{'; break; default: break; } return res; } }C++的代码如下:
#include <iostream> #include <stack> using namespace std; class Solution { public: bool isValid(string s) { if (s.length() <= 0) return true; stack<char> my; for (int i = 0; i < s.length(); i++) { char a = s[i]; if (a == '(' || a == '{' || a == '[') my.push(a); else if (a == ')' || a == '}' || a == ']') { if (my.empty()) return false; else { char b = getDuiYing(a); cout << a << " " << b << endl; if (my.top() == b) my.pop(); else return false; } } } return my.empty(); } char getDuiYing(char a) { switch (a) { case ')': return '('; case ']': return '['; case '}': return '{'; default: return a; } } };