Entrevista al programador preguntas de la entrevista clásica dorada 01.06. Compresión de cadenas

1. Introducción al tema

Compresión de cuerdas. Usando el número de ocurrencias repetidas de caracteres, escriba un método para lograr la compresión básica de cadenas. Por ejemplo, la cadena aabcccccaaa se convertirá en a2b1c5a3. Si la cadena de caracteres "comprimida" no se acorta, se devuelve la cadena de caracteres original. Puede asumir que la cadena contiene solo letras en inglés en mayúsculas y minúsculas (de la a a la z).

Ejemplo 1:

 Entrada: "aabcccccaaa"
 Salida: "a2b1c5a3"
Ejemplo 2:

 Entrada: "abbccd"
 Salida: "abbccd"
 Explicación: "abbccd" se comprime en "a1b2c2d1", que es más largo que la cadena original.
rápido:

La longitud de la cadena está en el rango de [0, 50000].

Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/compress-string-lcci
Copyright es propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Dos ideas para resolver problemas

        El mismo método de compresión de cadena de caracteres está de acuerdo con el número consecutivo de veces que el carácter + aparece comprimido. Si la longitud de la cadena comprimida se acorta, se devuelve la cadena comprimida; de lo contrario, se conserva la cadena original.

        Esta pregunta es fácil de implementar si usa objetos de tipo cadena, es decir, comprime la cadena dada según el método de compresión y finalmente compara la longitud de la cadena antes y después de la compresión, y devuelve una cadena más corta. Para evitar el problema de la redistribución y copia del espacio de almacenamiento causado por el aumento de la longitud de los objetos de cadena , se puede aplicar dinámicamente una matriz dinámica de longitud fija para completar el proceso anterior.

Tres, código de resolución de problemas

class Solution {
public:
    string compressString(string S) {
        int i = 0, j = 0;
        int len = S.size();
        if(len <= 2)
            return S;
        char *s = new char[len+5]; //因为字符长度最大是50000,即5位数
        char ch = S[0];
        int count = 1;
        for(i = 1; i <= len; ++i)
        {
            if(S[i] == ch)
                ++count;
            else if(S[i] != ch && j < len)
            {
                //压缩之前的字符
                s[j++] = ch;
                string str = to_string(count); //数字转成字符串
                for(int k = 0; k < str.size(); ++k)
                {
                    s[j++] = str[k]; 
                }
                if(j >= len)
                    return S;
                //记录下一个字符
                ch = S[i];
                count = 1;
            }   
        }
        s[j] = '\0';
        return string(s);
    }
};

Cuatro, resultados de resolución de problemas

Supongo que te gusta

Origin blog.csdn.net/qq_39661206/article/details/105629294
Recomendado
Clasificación