有效的括号
package leetcode;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
/**
* 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
* 有效字符串需满足:
* 左括号必须用相同类型的右括号闭合。
* 左括号必须以正确的顺序闭合。
* 注意空字符串可被认为是有效字符串。
* 示例 1:
* 输入: "()"
* 输出: true
* 示例 2:
* 输入: "()[]{}"
* 输出: true
* 示例 3:
* 输入: "(]"
* 输出: false
* 示例 4:
* 输入: "([)]"
* 输出: false
* 示例 5:
* 输入: "{[]}"
* 输出: true
*/
public class MyTest {
private HashMap<Character, Character> mappings;
// Initialize hash map with mappings. This simply makes the code easier to read.
public MyTest() {
this.mappings = new HashMap<Character, Character>();
this.mappings.put(')', '(');
this.mappings.put('}', '{');
this.mappings.put(']', '[');
}
public static void main(String[] args) {
String s = "(]";
//System.out.println(new MyTest().isValid(s));
System.out.println(new MyTest().isValidNB(s));
}
/**
* 笨比算法
* @param s
* @return
*/
public boolean isValid(String s) {
String str1 = "()";
String str2 = "[]";
String str3 = "{}";
while (s.contains(str1) || s.contains(str2) || s.contains(str3)) {
s = s.replace(str1, "").replace(str2, "").replace(str3, "");
}
return s.length()==0;
}
/**
* 大神算法
* 作者:LeetCode
* 链接:https://leetcode-cn.com/problems/two-sum/solution/you-xiao-de-gua-hao-by-leetcode/
* 来源:力扣(LeetCode)
* 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*
* @param s
* @return
*/
public boolean isValidNB(String s) {
// Initialize a stack to be used in the algorithm.
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// If the current character is a closing bracket.
if (this.mappings.containsKey(c)) {
// Get the top element of the stack. If the stack is empty, set a dummy value of '#'
char topElement = stack.empty() ? '#' : stack.pop();
// If the mapping for this bracket doesn't match the stack's top element, return false.
if (topElement != this.mappings.get(c)) {
return false;
}
} else {
// If it was an opening bracket, push to the stack.
stack.push(c);
}
}
// If the stack still contains elements, then it is an invalid expression.
return stack.isEmpty();
}
}