Grade 10 · Character stringsCitește în română
Removing the vowels
Original: Eliminarea vocalelor
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)
- Chapter
- Character strings
Examples
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.
/*
* 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.