Apilar
1. Título
2. Mis pensamientos y problemas iniciales
1. Resuma algunos puntos de conocimiento antes de escribir ideas:
(1) Para String s, obtenga la longitud
por s.length()
método para
char c = s.charAt(i);
obtener el carácter, i es el índice a partir de 0
(2) Para la
creación de la pila :, Stack<Character> stack = new Stack<>();
preste atención a la clase de empaquetado Carácter , para char
Empujar stack.push(c);
en la pila: salir de la pila: stack.pop();
juzgar vacío y juzgar el elemento superior de la pila:
if(!stack.isEmpty() && stack.peek()== ‘(’){...}
2. Ideas
(1) La longitud de la cadena debe ser un número doble, es decir, s.length ()% 2 == 0; de lo contrario, devolverá falso directamente.
(2) Cuando el carácter c es ([{Estos tres símbolos, ejecute la pila push(c)
(3) Cuando c es tres tipos de paréntesis derechos, analícelos por separado. Compruebe si la pila está vacía y si peek () en la parte superior de la pila es el paréntesis izquierdo correspondiente. stack, de lo contrario devuelve falso.
3. Problemas después de ejecutar el código que escribí :
(1) Escriba c == '(' como comillas dobles. Tenga en cuenta que c es un tipo char. Deben usarse comillas simples y comillas dobles para cadenas. Preste atención a esto, no preste atención. Es fácil de ignorar.
(2) Después de escribir el código, se olvida return stack.isEmpty()
y se encuentra después de la autoinspección. Después del recorrido, se ejecuta la pila vacía y el paréntesis efectivo es la pila vacía.
3. Método de resolución de problemas uno: apilar
Directamente en el código escrito por usted mismo:
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
//字符串包含的字符数能被2整除
if(s.length() % 2 == 0){
for(int i = 0;i < s.length();i++){
char c = s.charAt(i);
if(c == '(' || c== '[' || c == '{'){
//入栈
stack.push(c);
}else if(c == ')'){
if(!stack.isEmpty() && stack.peek() == '('){
stack.pop();
}else{
return false;
}
}else if(c == ']'){
if(!stack.isEmpty() && stack.peek() == '['){
stack.pop();
}else{
return false;
}
}else{
if(!stack.isEmpty() && stack.peek() == '{'){
stack.pop();
}else{
return false;
}
}
}
//这一句不要忘记,一开始漏掉了
return stack.isEmpty();
}
return false;
}
}
La solución oficial del problema usa HashMap en la pila. La solución del problema es similar a la que escribí yo mismo, pero la forma de almacenamiento de datos es diferente. El código oficial también se pone:
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();
}
}