Grade 10 · Character stringsCitește în română

Removing the vowels

Original: Eliminarea vocalelor

O(n)C++1736 lines1 example

The idea

We delete the vowels in the original string itself, with two indices: i reads every character, k shows where the next kept character is written. Consonants and other characters are copied to position k, vowels are skipped. At the end we put '\0' at position k. The method makes a single pass; the variant strcpy(s + i, s + i + 1) for every vowel is slower and, because source and destination overlap, is not guaranteed by the standard (use memmove if you want to move pieces of a string).

Original description (Romanian)

Ștergem vocalele chiar în șirul inițial, cu doi indici: i citește fiecare caracter, k arată unde scriem următorul caracter păstrat. Consoanele și celelalte caractere se copiază pe poziția k, vocalele se sar. La final punem '\0' pe poziția k. Metoda face o singură trecere; varianta strcpy(s + i, s + i + 1) pentru fiecare vocală este mai lentă și, pentru că sursa și destinația se suprapun, nu este garantată de standard (folosește memmove dacă vrei să muți bucăți de șir).

Complexity
O(L)
Grade
Grade 10 (Clasa a X-a)

Examples

Example 1

Input

Informatica este frumoasa

Expected output

nfrmtc st frms

The code

Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.

eliminarea-vocalelor.cpp
/*
 * Titlu: Eliminarea vocalelor
 * Clasa: 10
 * Capitol: Șiruri de caractere
 * Descriere: Ștergem vocalele chiar în șirul inițial, cu doi indici: i citește
 *            fiecare caracter, k arată unde scriem următorul caracter păstrat.
 *            Consoanele și celelalte caractere se copiază pe poziția k, vocalele se
 *            sar. La final punem '\0' pe poziția k. Metoda face o singură trecere;
 *            varianta strcpy(s + i, s + i + 1) pentru fiecare vocală este mai lentă
 *            și, pentru că sursa și destinația se suprapun, nu este garantată de
 *            standard (folosește memmove dacă vrei să muți bucăți de șir).
 * Complexitate: O(L)
 *
 * Exemplu
 * Intrare: Informatica este frumoasa
 * Ieșire: nfrmtc st frms
 */
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[256];
    cin.getline(s, 256);
    int k = 0;
    for (int i = 0; s[i] != '\0'; i++)
    {
        if (strchr("aeiouAEIOU", s[i]) == NULL)
            s[k++] = s[i];
    }
    s[k] = '\0';
    cout << s << '\n';
    return 0;
}

Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.