Estructuras de Datosc++stringscadenastextoSTL

Strings en C++

Aprende a manipular cadenas de texto en C++ para resolver problemas de competencias

OOI Oaxaca9 de febrero de 20266 min read

Strings en C++

En C++ puedes usar string de la STL, que es más cómodo que arreglos de char.

#include <string>
using namespace std;

int main() {
    string s = "Hola Mundo";
    cout << s << endl;
    return 0;
}

Operaciones básicas

Declaración e inicialización

string s1;                    // String vacío ""
string s2 = "Hola";           // "Hola"
string s3("Mundo");           // "Mundo"
string s4(5, 'a');            // "aaaaa"
string s5 = s2 + " " + s3;    // "Hola Mundo"

Acceso a caracteres

string s = "Hola";

cout << s[0] << endl;      // 'H'
cout << s[1] << endl;      // 'o'
cout << s.at(2) << endl;   // 'l' (con verificación de límites)
cout << s.front() << endl; // 'H' (primer carácter)
cout << s.back() << endl;  // 'a' (último carácter)

Longitud

string s = "Hola";

cout << s.length() << endl;  // 4
cout << s.size() << endl;    // 4 (equivalente)
cout << s.empty() << endl;   // 0 (false, no está vacío)

Modificación

Concatenación

string s = "Hola";

s += " Mundo";           // "Hola Mundo"
s.append("!");           // "Hola Mundo!"
s.push_back('?');        // "Hola Mundo!?"

Inserción y eliminación

string s = "Hola Mundo";

s.insert(5, "Cruel ");   // "Hola Cruel Mundo"
s.erase(5, 6);           // "Hola Mundo" (desde pos 5, eliminar 6 chars)
s.clear();               // "" (vacía el string)

Reemplazo

string s = "Hola Mundo";

s.replace(0, 4, "Adios");  // "Adios Mundo"

Substrings

string s = "Hola Mundo";

string sub1 = s.substr(0, 4);   // "Hola" (desde 0, 4 caracteres)
string sub2 = s.substr(5);      // "Mundo" (desde 5 hasta el final)

Búsqueda

string s = "Hola Mundo Hola";

size_t pos1 = s.find("Hola");       // 0 (primera ocurrencia)
size_t pos2 = s.rfind("Hola");      // 11 (última ocurrencia)
size_t pos3 = s.find("xyz");        // string::npos (no encontrado)

if (s.find("Mundo") != string::npos) {
    cout << "Encontrado!" << endl;
}

// Buscar desde una posición
size_t pos4 = s.find("Hola", 1);    // 11 (desde posición 1)

Comparación

string a = "abc", b = "abd";

// Comparación lexicográfica
if (a < b) cout << "a va antes" << endl;
if (a == b) cout << "Son iguales" << endl;

// Método compare
int cmp = a.compare(b);
// cmp < 0: a < b
// cmp == 0: a == b
// cmp > 0: a > b

Conversiones

String a número

string s = "12345";

int n = stoi(s);           // 12345 (string to int)
long l = stol(s);          // string to long
double d = stod("3.14");   // 3.14 (string to double)

Número a string

int n = 12345;
double d = 3.14159;

string s1 = to_string(n);  // "12345"
string s2 = to_string(d);  // "3.141590"

Entrada de strings

string palabra, linea;

cin >> palabra;           // Lee una palabra (hasta espacio)
getline(cin, linea);      // Lee toda la línea

// Cuidado: después de cin >> x, hay un '\n' residual
int n;
cin >> n;
cin.ignore();             // Ignorar el '\n'
getline(cin, linea);

Algoritmos útiles

Invertir

string s = "Hola";
reverse(s.begin(), s.end());  // "aloH"

Ordenar

string s = "dcba";
sort(s.begin(), s.end());  // "abcd"

Mayúsculas/Minúsculas

string s = "HoLa MuNdO";

// A minúsculas
for (char& c : s) {
    c = tolower(c);
}
// "hola mundo"

// A mayúsculas
for (char& c : s) {
    c = toupper(c);
}
// "HOLA MUNDO"

Verificar tipo de carácter

char c = 'A';

isalpha(c);   // true si es letra
isdigit(c);   // true si es dígito
isalnum(c);   // true si es letra o dígito
isspace(c);   // true si es espacio/tab/newline
isupper(c);   // true si es mayúscula
islower(c);   // true si es minúscula

Patrones comunes

Verificar palíndromo

bool esPalindromo(string s) {
    int i = 0, j = s.length() - 1;
    while (i < j) {
        if (s[i] != s[j]) return false;
        i++;
        j--;
    }
    return true;
}

Contar caracteres

int contarCaracter(string s, char c) {
    int cuenta = 0;
    for (char x : s) {
        if (x == c) cuenta++;
    }
    return cuenta;
}

// O usando count
int cuenta = count(s.begin(), s.end(), 'a');

Separar por delimitador

vector<string> separar(string s, char delim) {
    vector<string> resultado;
    stringstream ss(s);
    string token;

    while (getline(ss, token, delim)) {
        resultado.push_back(token);
    }

    return resultado;
}
// separar("a,b,c", ',') -> ["a", "b", "c"]

Frecuencia de caracteres

int freq[256] = {0};  // Para todos los caracteres ASCII

for (char c : s) {
    freq[c]++;
}

Ejemplo: Anagramas

Dos palabras son anagramas si tienen las mismas letras:

bool sonAnagramas(string a, string b) {
    if (a.length() != b.length()) return false;

    sort(a.begin(), a.end());
    sort(b.begin(), b.end());

    return a == b;
}

Ejemplo: Comprimir string

string comprimir(string s) {
    if (s.empty()) return s;

    string resultado = "";
    char actual = s[0];
    int cuenta = 1;

    for (int i = 1; i <= s.length(); i++) {
        if (i < s.length() && s[i] == actual) {
            cuenta++;
        } else {
            resultado += actual;
            if (cuenta > 1) {
                resultado += to_string(cuenta);
            }
            if (i < s.length()) {
                actual = s[i];
                cuenta = 1;
            }
        }
    }

    return resultado;
}
// "aaabbc" -> "a3b2c"

Ejercicios de práctica

Ejercicio 1

Verifica si dos strings son rotaciones una de otra.

Ver solución
bool sonRotaciones(string a, string b) {
    if (a.length() != b.length()) return false;
    string concatenado = a + a;
    return concatenado.find(b) != string::npos;
}
// "abcd", "cdab" -> true

Ejercicio 2

Encuentra el substring palíndromo más largo.

Ver solución
string palindromoMasLargo(string s) {
    int n = s.length();
    if (n == 0) return "";

    int inicio = 0, maxLen = 1;

    auto expandir = [&](int i, int j) {
        while (i >= 0 && j < n && s[i] == s[j]) {
            if (j - i + 1 > maxLen) {
                inicio = i;
                maxLen = j - i + 1;
            }
            i--;
            j++;
        }
    };

    for (int i = 0; i < n; i++) {
        expandir(i, i);     // Palindromos de longitud impar
        expandir(i, i + 1); // Palindromos de longitud par
    }

    return s.substr(inicio, maxLen);
}

Siguiente paso

Aprende sobre Matrices para trabajar con datos bidimensionales.