Técnicas de Manipulación de Cadenas en C++

Inversión de Cadenas

Para invertir una cadena de caracteres en C++, se puede utilizar un enfoque de punteros dobles. El siguiente código muestra una implementación que intercambia los elementos desde los extremos hacia el centro.

void invertirCadena(vector<char>& cadena) {
    int inicio = 0;
    int fin = cadena.size() - 1;
    while (inicio < fin) {
        char temp = cadena[inicio];
        cadena[inicio] = cadena[fin];
        cadena[fin] = temp;
        inicio++;
        fin--;
    }
}</char>

En problemas donde se necesita relenar un arreglo, es común preexpandir el arreglo al tamaño final deseado y luego operar desde el final hacia el principio para evitar sobrescrituras.

Eliminación de Espacios Extra

Se puede usar la técnica de punteros rápido y lento para eliminar espacios adicionales en una cadena y asegurar que solo haya un espacio entre palabras. Aquí se muestra una función que procesa la cadena in-situ.

void limpiarEspacios(string& texto) {
    int escritor = 0;
    for (int lector = 0; lector < texto.size(); ++lector) {
        if (texto[lector] != ' ') {
            if (escritor != 0) {
                texto[escritor++] = ' ';
            }
            while (lector < texto.size() && texto[lector] != ' ') {
                texto[escritor++] = texto[lector++];
            }
        }
    }
    texto.resize(escritor);
}

Algoritmo KMP para Búsqueda de Cadenas

El algoritmo Knuth-Morris-Pratt (KMP) optimiza la búsqueda de un patrón dentro de un texto al reutilizar información de coincidencias previas cuando ocurre un desajuste, evitando reinicios innecesarios. Consiste en dos funciones principales: una para calcular el areglo de fallos (next) y otra para realizar la búsqueda.

La función calcularNext detremina el arreglo que indica el prefijo más largo que también es sufijo para cada posición del patrón.

void calcularNext(int* fallos, const string& patron) {
    int longitud = -1;
    fallos[0] = longitud;
    for (int idx = 1; idx < patron.size(); idx++) {
        while (longitud >= 0 && patron[idx] != patron[longitud + 1]) {
            longitud = fallos[longitud];
        }
        if (patron[idx] == patron[longitud + 1]) {
            longitud++;
        }
        fallos[idx] = longitud;
    }
}

La función buscarSubcadena utiliza el arreglo de fallos para localizar el patrón en el texto de manera eficiente.

int buscarSubcadena(const string& texto, const string& patron) {
    if (patron.empty()) {
        return 0;
    }
    vector<int> fallos(patron.size());
    calcularNext(fallos.data(), patron);
    int coincidencia = -1;
    for (int pos = 0; pos < texto.size(); pos++) {
        while (coincidencia >= 0 && texto[pos] != patron[coincidencia + 1]) {
            coincidencia = fallos[coincidencia];
        }
        if (texto[pos] == patron[coincidencia + 1]) {
            coincidencia++;
        }
        if (coincidencia == patron.size() - 1) {
            return pos - patron.size() + 1;
        }
    }
    return -1;
}</int>

Etiquetas: C++ cadenas KMP algoritmos Punteros

Publicado el 7-16 11:37