Dada una cadena que consta solo de '(', ')', '{', '}', '[', ']', determine si la cadena es válida.
Las cadenas de caracteres válidas deben cumplir:
(1) El corchete de apertura debe cerrarse con el mismo tipo de corchete de cierre.
(2) Los paréntesis izquierdos deben cerrarse en el orden correcto.
Por ejemplo, "()", "()[]{}", "{[]}" son todas cadenas válidas, pero "(]", "([)]" no lo son.
Podemos usar stack Stack para resolver este problema.
(1) Primero, almacenamos las reglas correspondientes entre paréntesis en Mapa;
(2) Crea una pila. Recorra la cadena, si el carácter es un paréntesis izquierdo, se agregará directamente a la pila; de lo contrario, compare el elemento superior de la pila con el paréntesis y devuelva falso si no son iguales. El recorrido termina, si la pila está vacía, devuelve verdadero.
public class Test {
public static void main(String[] args) {
System.out.println("()[]{} 符号是否成对出现:" + isValid("()[]{}"));
System.out.println("{[]} 符号是否成对出现:" + isValid("{[]}"));
System.out.println("(] 符号是否成对出现:" + isValid("(]"));
System.out.println("([)] 符号是否成对出现:" + isValid("([)]"));
}
public static boolean isValid(String s){
// 括号之间的对应规则
HashMap<Character, Character> mappings = new HashMap<Character, Character>();
mappings.put(')', '(');
mappings.put('}', '{');
mappings.put(']', '[');
Stack<Character> stack = new Stack<Character>();
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
/**
* 如果字符不是右半部分(是左半部分)则压入栈中
*/
if (mappings.containsKey(chars[i])) {
char topElement = stack.empty() ? '#' : stack.pop();
/**
* 将当前字符与栈顶进行比较
*/
if (topElement != mappings.get(chars[i])) {
return false;
}
} else {
stack.push(chars[i]);
}
}
return stack.isEmpty();
}
}
La salida es:
()[]{
} 符号是否成对出现:true
{
[]} 符号是否成对出现:true
(] 符号是否成对出现:false
([)] 符号是否成对出现:false