Funkcja zwracającą ilość niepowtarzających się znaków, występujących w napisie

0

Jak napisać funkcję zwracającą ilość niepowtarzających się znaków, występujących w napisie?
Funkcja ma mieć postać int norep(char *napis) która dla napisu np aabcdad zwróci 4.

0

Hm ma rozróżniać duże i małe litery? Najprościej będzie chyba zrobić tablicę o odpowiedniej liczbie elementów, potem sprawdzać napis po znaku i incrementować odpowiadająca mu wartość a na koniec policzyć jedynki i zwrócić ich liczbę.

ps czemu 4 a nie 2? jak dla mnie tylko b i c się nie powtarzają. No chyba że ma policzyć znaki w napisie z pominięciem powtórzeń, wtedy "jadąc" po znakach w tablicy sprawdzasz czy jest już taki w tablicy wynikowej (początkowo pustej), jak nie ma to dodajesz i incrementujesz zmienną zwracaną przez tą funkcję.

0

Sposób 1 - zaproponowany przez sig, dość nudny w sumie, ale dość prosty i niewymagający myślenia:

int boring_norep(char *napis) {
    bool used[0x100] = { 0 };
    int count = 0;
    for (; *napis; napis++) {
        if (!used[(unsigned char)*napis]) {
            used[(unsigned char)*napis] = true;
            count++;
        }
    } return count;
}

Sposób 2 - moja @_13th_Dragona i @rincewinda ambitniejsze podejścia do tego ('C++-owo'):

int norep(char *napis) {
    return std::set<char>(napis, napis + strlen(napis)).size();
}
0

Zajrzałem jak poprawiłeś i wpadłem jeszcze na to:

size_t not_boring_norep(char *napis)
  {
   bool used[256]={0};
   size_t count=0;
   for(unsigned char *i=(unsigned char*)napis;*i;used[*i++]=true) if(!used[*i]) ++count;
   return count;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1