(Java) leetcode-125 Válido palíndromo

título

【】有效回文串
Dada una cadena, determinar si es un palíndromo, considerando sólo los caracteres alfanuméricos y haciendo caso omiso de los casos.

Nota: A los efectos de este problema, definimos cadena vacía como palíndromo válida.

Ejemplo 1:

De entrada: “Un hombre, un plan, un canal: Panamá”
Salida: true
Ejemplo 2:

De entrada: “correr un coche”
de salida: false

Ideas 1

Hay que eliminar primero los caracteres extraños, puede utilizar expresiones regulares para igualar y suprimir, eludir caso porque la descripción del título, seguido de los caracteres de la cadena en minúsculas. Esta inversión de hablar cadena como una nueva cadena, la cadena puede comparar el viejo y nuevo.

código 1

public class Solution {
    public boolean isPalindrome(String s) {
    	if (s.isEmpty()) {
        	return true;
        }
        String actual = s.replaceAll("[^A-Za-z0-9]", "").toLowerCase();//删除所有的:非字母数字字符,并讲所有的大写字母转换为小写字母
        String rev = new StringBuffer(actual).reverse().toString();//将字符串进行反转
        return actual.equals(rev);//比较
    }
}

1 resultados presentados

Tiempo de ejecución: 15 ms, más rápido que el 28,86% de las presentaciones en línea de Java para Válido palíndromo.
Uso de memoria: 40,3 MB, menos del 10,36% de las presentaciones en línea de Java para Válido palíndromo.

Ideas 2

puntero doble, un uno, garantizando al mismo tiempo las letras o números premisa puntero carácter, se determina cada carácter que señala (después de minúsculas) son iguales. Dado que ningún personaje coincide, por lo que la idea de la eficiencia de 1 superior.

código 2

public class Solution {
    public boolean isPalindrome(String s) {
        if (s.isEmpty()) {
        	return true;
        }
        int head = 0, tail = s.length() - 1;//首尾指针
        char cHead, cTail;
        while(head <= tail) {
        	cHead = s.charAt(head);//更新字符
        	cTail = s.charAt(tail);
        	if (!Character.isLetterOrDigit(cHead)) {
        		head++;//若首指针指向的字符非字母或非数字,则指针后移
        	} else if(!Character.isLetterOrDigit(cTail)) {
        		tail--;//若尾指针指向的字符非字母或非数字,则指针前移
        	} else {
        		if (Character.toLowerCase(cHead) != Character.toLowerCase(cTail)) {
        			return false;//回文检测不通过
        		}
        		head++;//移动指针,继续检测
        		tail--;
        	}
        }//while
        
        return true;//通过检测
    }
}

Presentar los resultados

Duración: 4 ms, más rápido que el 83,24% de las presentaciones en línea de Java para Válido palíndromo.
Uso de memoria: 37,8 MB, menos de 56.88% de las presentaciones en línea de Java para Válido palíndromo.

resumen

El método clave:

s.replaceAll(String regex, String replacement);
s.toLowerCase();
s1.equals(s2);
bf.reverse().toString();
Character.toLowerCaese();
Character.isLetterOrDigit();
Publicados 143 artículos originales · ganado elogios 45 · Vistas a 70000 +

Supongo que te gusta

Origin blog.csdn.net/z714405489/article/details/89518992
Recomendado
Clasificación