leetcode20 有效的括号
题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
算法思路
法一:这种方法比较容易理解,只要不断从字符串中用空字符串“”替换“()”,"{}","[]"即可,直到不能替换时判断剩余字符串是否为空,为空则匹配。
法二:使用栈来实现,遍历字符串的字符,遇到左括号就将右括号入栈,遇到右括号就将该括号与栈顶弹出的元素比较,不同则不匹配,直到遍历所有字符,栈为空则匹配。
代码实现
法一
public class Solution {
public static void main(String args[]) {
System.out.println(isValid("{}{{[[()]]}}"));
}
public static boolean isValid(String s) {
//每轮递归依次删去"()","[]","{}",若删到最后字符串为空,则括号匹配
if (s.contains("()") || s.contains("[]") || s.contains("{}")) {
return isValid(s.replace("()", "").replace("[]", "").replace("{}", ""));
} else {
return "".equals(s);
}
}
}
法二
import java.util.Stack;
public class Solution {
public static void main(String args[]) {
System.out.println(isValid("{}{{[[()]]}}"));
}
public static boolean isValid(String s) {
//每次遇到左括号时右括号进栈,遇到右括号时栈顶元素出栈与之比较,不同则不匹配,直到遍历所有字符栈为空则匹配。
Stack<Character>stack = new Stack<Character>();
for(char c: s.toCharArray()){
if(c=='(')stack.push(')');
else if(c=='[')stack.push(']');
else if(c=='{')stack.push('}');
else if(stack.isEmpty()||c!=stack.pop())return false;
}
return stack.isEmpty();
}
}