• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja sprawdzająca czy wyraz jest isogramem sprawdza zgodność tylko pierwszej litery z drugą

0 głosów
744 wizyt
pytanie zadane 5 kwietnia 2019 w C i C++ przez 11ShowMan11 Nowicjusz (150 p.)

Witam, chciałbym napisać funkcje która sprawdza czy dany wyraz jest isogramem. To znaczy czy litery w nim nie powtarzają się.

Problem polega na tym, że funkcja porównuje tylko dwie pierwsze litery w słowie więc w przypadku "aba" funkcja zwraca wartość "true" co oznaczałoby że wyraz ten jest isogramem, a nim nie jest ze względu na powtarzającą się literkę "a".

#include <iostream>

bool isogram_czy_nie(std::string str) {
    int reason = 0;
    for(int i = 0; i<=str.length(); i++){
        char b = str[i];
        for (int j = 1; j <= str.length(); j++){
          if (b == str[j]){
          reason += 1;
        }
        else{
        reason += 0;
        }
        if (reason > 0){
            return 0;
        }
        else{
            return 1;
        }
      }
    }
}

int main(){
    std::string str;
    std::cin>>str;
    std::cout<< isogram_czy_nie(str);
}

 

1 odpowiedź

+1 głos
odpowiedź 5 kwietnia 2019 przez mokrowski Mędrzec (158,940 p.)
wybrane 5 kwietnia 2019 przez 11ShowMan11
 
Najlepsza
Tym sposobem nie wykonasz tego zadania.

Proste podejście to:

1. Posortowanie liter i sprawdzenie czy 2 obok nie są takie same.

2. Przetworzenie std::string na std::unordered_set i sprawdzenie czy oba kontenery zawierają tę samą ilość elementów.

3. inne (dość egzotyczne i przy wstępnych założeniach).

Najprościej, zrób to 1 sposobem.
komentarz 5 kwietnia 2019 przez 11ShowMan11 Nowicjusz (150 p.)
Faktycznie, uczę się c++ od tygodnia i nie wpadło mi do głowy, że można litery po prostu posortować. Dziękuje za odpowiedź.
komentarz 5 kwietnia 2019 przez Kacper Sas Dyskutant (8,460 p.)
Witam, pytanie odnoszące się do tego problemu. Czy rozwiązanie go za pomocą std::map jest w miarę rozsądnym założeniem, czy to za gruba armata?
1
komentarz 5 kwietnia 2019 przez mokrowski Mędrzec (158,940 p.)

Przy std::map ponosisz koszt zbędnego sortowania wg. klucza. Jeśli coś z rodziny map to std::unordered_map. Będziesz wtedy gromadził ilość wystąpień litery. Następnie sprawdzisz czy jakiekolwiek licznik nie ma wartości większej niż 1.

Klasa alg. dla dodania do std::map to O(log(n)): https://en.cppreference.com/w/cpp/container/map/insert

..a dla wyszukania O(log(n)) (ogólnie: https://en.cppreference.com/w/cpp/container/map/find )

Klasa alg. dla dodania do std::unordered_map to O(n): https://en.cppreference.com/w/cpp/container/unordered_map/insert

.. a dla wyszukania O(1) (ogólnie: https://en.cppreference.com/w/cpp/container/unordered_map/find )

Jeszcze lepszym rozwiązaniem będzie bazowanie na std::set. Jego metoda insert(...) zwraca parę iterator i bool gdzie bool przechowuje true jeśli udało się dodać dane a false jeśli już były :) Stąd rozwiązanie będzie w klasie O(log(n)). Ale zbędne będzie przeglądanie po, odwracanie logiki na pesymistyczną (żeby szybciej znaleźć) czy analizowanie liczników.

Osobiście w rzeczywistym projekcie, nie wiedząc jak duże będą dane, użył bym set. Tu jednak autor pytania (zapewne - co założyłem), ma zabronione użycie czegoś z <algorithm> :)

Podobne pytania

0 głosów
1 odpowiedź 1,234 wizyt
pytanie zadane 21 kwietnia 2020 w C i C++ przez saju13013 Nowicjusz (230 p.)
0 głosów
2 odpowiedzi 758 wizyt
0 głosów
2 odpowiedzi 521 wizyt

93,599 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,082 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...