0
votes

Rechercher une chaîne pour toutes les occurrences d'une sous-chaîne en C ++

Écrivez une fonction CountMatchches qui recherche la sous-chaîne de la chaîne donnée et renvoie le nombre de fois que la sous-chaîne apparaît dans la chaîne. p>

J'ai été coincé sur ce temps maintenant (plus de 6 heures) et j'apprécierais vraiment toute aide que je peux obtenir. J'aimerais vraiment comprendre cela mieux. P>

int countMatches(string str, string comp)
{
    int small = comp.length();
    int large = str.length();
    int count = 0;

    // If string is empty
    if (small == 0 || large == 0) {
        return -1;
    }

    // Increment i over string length
    for (int i = 0; i < small; i++) {
        // Output substring stored in string
        for (int j = 0; j < large; j++) {
            if (comp.substr(i, small) == str.substr(j, large)) {
                count++;
            }
        }
    }

    cout << count << endl;
    return count;
}

2 commentaires

Avez-vous essayé de progresser dans votre code avec un débogueur, tout en enquêtant sur les valeurs, des variables, à chaque étape d'exécution?


Pourquoi appelez-vous substr sur comp ?


3 Réponses :


1
votes

Je l'ai compris. Je n'ai pas besoin d'une boucle imbriquée parce que je comparais seulement la chaîne secondaire à celle de la chaîne. Il a également éliminé la nécessité de prendre la sous-chaîne de la première chaîne. Sooo ... Pour les personnes intéressées, il aurait dû ressembler à ceci: xxx


2 commentaires

Putain j'étais au milieu d'une réponse


Oui, cela fonctionne. Mais chacun de ces appels vers substr crée une chaîne temporaire, qui est détruite après la comparaison. C'est beaucoup de mémoire. Voir ma réponse pour une autre approche.



0
votes

Le problème avec votre fonction est que vous vérifiez que:

  • Bonjour est la sous-chaîne de Bonjour
  • ello est la sous-chaîne de ello
  • llo est la sous-chaîne de llo
  • ...

    Bien sûr, cela correspond à 5 fois dans ce cas.


    Ce que vous avez vraiment besoin est:

    • pour chaque position i de str
    • Vérifiez si la sous-chaîne de STR à partir de i et de longueur = comp.size () est exactement comp .

      Le code suivant doit faire exactement cela: xxx


0 commentaires

0
votes

L'approche habituelle consiste à rechercher en place: xxx

qui peut être modifié si vous n'êtes pas préoccupé par les allumettes qui se chevauchent (c'est-à-dire à la recherche de toutes les occurrences de "LL" dans la chaîne "LLLL", la réponse pourrait être 3, que l'algorithme ci-dessus donnera, ou cela pourrait être 2, si vous ne laissez pas le prochain match de chevaucher le premier. Pour ce faire, changez simplement ++ POS < / code> à pos + = petit.size () Pour reprendre la recherche après la correspondance précédente.


0 commentaires