El 2 de julio de 2023, leetcode verifica una pregunta por día: 125. Verificación de la cadena palindrome

1. Descripción del tema y requisitos

125. Verificar palíndromo - LeetCode

Tema Descripción

Si después de convertir todos los caracteres en mayúsculas a minúsculas y eliminar todos los caracteres no alfanuméricos, la frase se lee igual hacia adelante y hacia atrás. Entonces la frase puede ser considerada como un  palíndromo .

Tanto las letras como los números son caracteres alfanuméricos.

Dada una cadena s, devuelve verdadero si es un palíndromo ; de lo contrario, devuelve falso .

ejemplo

Ejemplo 1:

输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。

Ejemplo 2:

输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。

 Ejemplo 3:

输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。

pista

  • 1 <= s.length <= 2 * 105
  • s Consta únicamente de caracteres ASCII imprimibles

2. Ideas para resolver problemas

Idea general:

       En primer lugar, de acuerdo con los requisitos del tema, existen dos métodos principales de resolución de problemas: uno es modificar la matriz en sí, cambiarla a la forma que se va a juzgar y luego juzgar si es un palíndromo; la otra es use punteros dobles Los caracteres excluidos se omiten para determinar si la cadena completa es un palíndromo. [La variable de subíndice que se menciona a continuación se refiere a la variable entera utilizada para indicar el subíndice]

       Para el primer método, primero debemos convertir todos los caracteres en mayúsculas de la matriz a caracteres en minúsculas. De hecho, las 26 letras mayúsculas se convierten en minúsculas, lo que se puede realizar mediante "ch=ch+32". Luego elimine todos los caracteres no alfanuméricos de la matriz, es decir, elimine caracteres que no sean letras y números. Puede usar la idea de cobertura para sobrescribir todos los caracteres detrás cada vez que encuentre un carácter no alfanumérico. Sobrescribir solo uno se necesita usar la variable de subíndice (más tiempo). También puede usar dos variables de subíndice, una para recorrer toda la matriz y la otra para registrar la matriz modificada. Luego, compara directamente el primer y el último carácter de la matriz modificada para determinar si se trata de un palíndromo.

       Para el segundo método, necesitamos establecer una condición de juicio, es decir, solo cuando dos caracteres sean letras o números, los compararemos, una vez que uno de ellos no lo sea, necesitamos encontrar el siguiente carácter para comparar, que es el llamado "saltar por encima". Este método requiere el uso de "punteros dobles", es decir, dos variables de subíndice. En el caso de ambas partes, solo necesita modificar las letras mayúsculas a minúsculas, y luego juzgar si son iguales, si son iguales, mueva el puntero y continúe comparando hasta el final del recorrido/fin si es no es un palíndromo. [En el proceso de implementación de este método, el código para juzgar si un carácter es un carácter alfanumérico es relativamente largo y parece desordenado, por lo que puede optar por escribirlo como una función separada] [Se puede modificar letras mayúsculas a minúsculas antes de juzgar caracteres Modifique toda la matriz, o modifíquela después del juicio]

Pasos específicos:

método uno:

① Atraviese la matriz y convierta todos los caracteres en mayúsculas en caracteres en minúsculas

② Eliminar todos los caracteres no alfanuméricos de la matriz [se puede dividir en varias variables de subíndices]

③ Obtenga la longitud de la matriz

④ Determinar si la cadena modificada es un palíndromo

Método dos:

① Obtenga la longitud de la matriz

② Convierta todos los caracteres en mayúsculas de la matriz en caracteres en minúsculas

③ Determine si el primer y el último carácter son caracteres alfanuméricos, y determine si son iguales, y luego mueva el puntero hasta obtener el resultado


3. Código específico [lenguaje C]

① Use solo una variable de subíndice para modificar (sobrescribir) la matriz [tiempo de espera, pero los pasos son claros y se pueden usar para comprender]

bool isPalindrome(char* s) {
    int i = 0, j = 0;
    for (int i = 0; s[i] != '\0'; i++) { //遍历数组,将大写字符全部转换成小写字符
        if (s[i] >= 'A' && s[i] <= 'Z') {
            s[i] += 32;
        }

    }
    while (s[i] != '\0') {
        if ((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z')) //是数字或者字母字符 访问下一个
        {
            i++;
        }
        else { //不是数字或者字符 覆盖并继续检查
            for (j = i; s[j] != '\0'; j++) {
                s[j] = s[j + 1];
            }
            s[j - 1] = '\0';//此时j-1指向最后一个字符的后面第一位
        }
    }
    int len = strlen(s);
    //k=j-2是因为,数组下标从0开始,j-1是结束符的下标,j-2就是最后一个字符的下标
    for (int i = 0, k = len - 1; i < k; i++) {
        if (s[i] != s[k])
            return false;
        else k--;
    }
    return true;
}

② Modificar ①, es decir, usar dos variables de subíndice para realizar la modificación de la matriz [las mayúsculas se cambian a minúsculas y se sobrescriben al mismo tiempo] [más rápido]

bool isPalindrome(char* s) {
    int i = 0, j = 0;
    for (int i = 0; s[i] != '\0'; i++) { //遍历数组,将大写字符全部转换成小写字符
        if (s[i] >= 'A' && s[i] <= 'Z') {
            s[j++] = s[i] + 32;
        }
        else if ((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z')) {
            s[j++] = s[i];
        }
    }
    //此时j指向调整后的数组的结束符
    for (int i = 0, k = j - 1; i < k; i++) {
        if (s[i] != s[k])
            return false;
        else k--;
    }
    return true;
}

③ No modifique la matriz, compare directamente

bool Judge(char ch) {
    if ( (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) {
        return true;
    }
    else {
        return false;
    }
}

bool isPalindrome(char * s){
    int j=strlen(s)-1;
    for(int i=0;s[i]!='\0';i++){ //遍历数组,将大写字符全部转换成小写字符
        if (s[i] >= 'A' && s[i] <= 'Z')  s[i]+=32;
    }
    for (int i = 0; s[i]!='\0'; i++) { 
        while(i<j){
            if(Judge(s[i])&&Judge(s[j])){
               if(s[i]!=s[j])  return false;
               i++; j--;
            }
            else if(!Judge(s[i])){
            i++;
            }
            else{
            j--;
            }
        }
    }
    return true;
}


 

Supongo que te gusta

Origin blog.csdn.net/m0_59800431/article/details/131506300
Recomendado
Clasificación