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;
}
}
};