主要思想:判断是左括号,就加入到栈中,如果是右括号则判断栈顶是否与之匹配.如果不匹配,直接返回false.如果匹配,则出栈.继续匹配.
public boolean isValid(String s) {
String kuohao = "({[)}]";
String stack = "";
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
int index = -1;
for (int k = 0; k < kuohao.length(); k++) {
if (c == kuohao.charAt(k)) {
index = k;
break;
}
}
if (index > 2) {
if (stack.length() > 0 && stack.charAt(stack.length() - 1) == kuohao.charAt(index - 3)) {
stack = stack.substring(0, stack.length() - 1);
} else return false;
} else {
stack += c;
}
}
if (stack.length() > 0) return false;
return true;
}
根据ASCII进行匹配,括号的ASCII码之间相差1或者2
public boolean isValid1(String s) {
String res = "";
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (res.length() > 0 && (c - res.charAt(res.length() - 1) == 1 || c - res.charAt(res.length() - 1) == 2)) {
if (res.length() == 1) res = "";
else
res = res.substring(0, res.length() - 1);
continue;
}
res += c;
}
return res.length() == 0;
}
官方代码,使用到了hashmap以及栈的结构,我由于对于库函数不是很熟悉,所以就没有写出来.参考一下官方代码.
class Solution {
public boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) {
return false;
}
Map<Character, Character> pairs = new HashMap<Character, Character>() {
{
put(')', '(');
put(']', '[');
put('}', '{');
}};
Deque<Character> stack = new LinkedList<Character>();
for (int i = 0; i < n; i++) {
char ch = s.charAt(i);
if (pairs.containsKey(ch)) {
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
return false;
}
stack.pop();
} else {
stack.push(ch);
}
}
return stack.isEmpty();
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
附一下自己的仿官方写法
public boolean isValide(String s) {
if(s.length()%2==1)return false;
Map<Character, Character> map = new HashMap<>() {
{
put('(', ')');
put('[', ']');
put('{', '}');
}};
Deque<Character> stack = new LinkedList<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if((!stack.isEmpty())&&map.get(stack.peek())==c){
stack.pop();
continue;
}
if(map.get(c)==null)return false;
stack.push(c);
}
return stack.isEmpty();
}
主要思路是如果右括号没有匹配成功返回false