LeetCode · Pregunta diaria · 1177. Construcción de detección de cadenas de palíndromo · Suma de prefijos

Autor: Xiao Xun
Enlace: https://leetcode.cn/problems/can-make-palindrome-from-substring/solutions/2309940/qian-zhui-he-zhu-shi-chao-ji-xiang-xi-by- n3ps/
Fuente: Los derechos de autor de LeetCode
pertenecen al autor. Para reimpresión comercial, comuníquese con el autor para obtener autorización, para reimpresión no comercial, indique la fuente.

tema

 

tren de pensamiento

Título -> Dada una cadena, seleccione cualquier posición LR en ella, puede reorganizar cualquier carácter y reemplazar cualquier carácter K, de modo que la subcadena LR sea una cadena palíndromo, si puede cumplir con los requisitos, será VERDADERO, si no, será FALSO.

Es necesario convertirlo en una cuerda palíndromo ¿Qué es una cuerda palíndromo? Si la forma es abccba, es una cadena palíndromo, en la que existe la característica de que el mismo carácter es un número par , o en base a lo anterior, solo un carácter tiene un número impar de ocurrencias.

Así que ahora es simple El significado de la pregunta solo se preocupa por si se pueden cumplir los requisitos, no los caracteres específicos. Luego, puede convertir la cadena dada en una cadena de ocurrencias de caracteres y juzgar si una subcadena se puede convertir en un palíndromo -> juzgar si la cantidad de ocurrencias de caracteres en la posición actual cumple con los requisitos anteriores

Entonces, ¿cómo convertir a los requisitos de significado de la pregunta anterior? Dada una subcadena:

  • Si el número de ocurrencias del mismo carácter es un número par, entonces este carácter no necesita ser modificado
  • Si el número de ocurrencias del mismo carácter es impar:
    • Solo hay un número impar de ocurrencias de un personaje, no es necesario usar el número de modificaciones
    • Si aparecen varios caracteres en ocasiones impares, debe utilizar el número de apariciones/2 veces de modificación para convertir los caracteres redundantes en apariciones pares.

¿Cómo contar el número de ocurrencias de cada carácter de posición?

  • Use una matriz para registrar el número de ocurrencias de caracteres en cada subcadena
  • Debido a que solo hay 26 caracteres, puede usar un bit de tipo int para registrar el número de ocurrencias. 0 significa tiempos pares y 1 significa tiempos impares.
  • Se puede usar la suma de prefijos, y el estado actual se puede obtener por la diferencia entre los estados de la subcadena izquierda y derecha en cualquier posición

Los comentarios del código son muy detallados.

el código


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

bool* canMakePaliQueries(char * s, int** queries, int queriesSize, int* queriesColSize, int* returnSize) {
    int n = strlen(s);
    int* count = (int*)malloc((n + 1) * sizeof(int));//二进制代替数组
    memset(count, 0, (n + 1) * sizeof(int));//初始化
    for (int i = 0; i < n; i++) {//前缀和枚举
        // ^ 为不带进位的加法
        count[i + 1] = count[i] ^ (1 << (s[i] - 'a'));//记录整体状态
    }
    bool* res = (bool*)malloc(queriesSize * sizeof(bool));//返回值数组
    for (int i = 0; i < queriesSize; i++) {//枚举子串
        int l = queries[i][0], r = queries[i][1], k = queries[i][2];
        //根据上述表示,大于13则可以能满足转换要求
        //if (k >= 13) {res[i] = true; continue;}
        // 由于没有负值, 那么 0 - 1 等价于 0 + 1
        int bits = 0, x = count[r + 1] ^ count[l];//相差得出当前状态
        while (x > 0) {//求当奇数出现次数
            x &= x - 1;
            bits++;
        }
        res[i] = bits / 2 <= k;//保存有效值
    }
    *returnSize = queriesSize;
    free(count);
    return res;
}



作者:小迅
链接:https://leetcode.cn/problems/can-make-palindrome-from-substring/solutions/2309940/qian-zhui-he-zhu-shi-chao-ji-xiang-xi-by-n3ps/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Supongo que te gusta

Origin blog.csdn.net/m0_64560763/article/details/131224666
Recomendado
Clasificación