|
|
|
|
Bonjour,
Je suis en train de faire un programme qui recherche des anagrammes (j'entends par anagramme un mot qui peut s'écrire avec les lettres d'un autre). Après de nombreux essais je pensais avoir définitivement trouvé comment écrire ma fonction principale isAnagram, mais je viens de terminer le reste du code et je m'aperçois qu'en fait elle me donne des faux positifs (et peut-être des faux négatifs mais c'est moins évident à déterminer)
Si quelqu'un pouvait regarder mon code et me dire comment le corriger... Merci !
// stringD.h
class stringD
{
private:
s1,s2:std::string;
// s1 et s2 ne contiennent que des lettres majuscules entre 'A' et 'Z'
// s2 contient les mêmes lettres que s1 mais triées dans l'ordre alphabétique
public:
size_t size(void);
bool isAnagram(stringD s);
};
// stringD.cpp
bool stringD::isAnagram(stringD s) // this* est-il écrit avec les lettres de s ?
{
if (size()>s.size()) return false;
for (unsigned i=0,j=0; j<s.size(); i++, j++)
{
while (s.s2[j]<s2[i])
j++;
if (s2[i]!=s.s2[j])
return false;
}
return true;
}Un exemple de faux positif :x.s1="LETTRES", x.s2="EELRSTT" y.s1="LUTTEUR", y.s2="ELRTTUU" bool b=x.isAnagram(y); // b==true !?La confiance n'exclut pas le contrôle
Configuration: Windows Vista SP2 / Qt 4.5.2
Je ne comprend pas ton algorithme.
|
Je suis d'accord sur la vraie définition d'un anagramme.
|
OK, je comprends mieux. Je n'avais pas compris ta première explication.
bool stringD::isAnagram(stringD s) // this* est-il écrit avec les lettres de s ?
{
if (size()>s.size()) return false;
int j=0;
for (unsigned i=0; i<size(); i++)
{
while (s.s2[j]<s2[i])
j++;
if (s2[i]!=s.s2[j])
return false;
else j++;
}
return true;
}
Mais tu peux faire ça aussi en pile. (écriture en algorithme, je ne suis pas certain des fonctions utilisées)
bool stringD::isAnagram(stringD s) // this* est-il écrit avec les lettres de s ?
{
if (size()>s.size()) return false;
for(int i=0;i<s.size();++i)
{
int pos=s.s2.find(s[i]);
if(pos==std::string::npos) return false;
else s2.remove(pos);
}
return true;
}
Salutation ! (il faut bien que vous compreniez que j'ai TOUJOURS raison)
Char Snipeur |
Merci, ton premier algorithme ne marche pas mieux, mais en partant sur l'idée du deuxième algorithme j'ai réussi à modifier et à obtenir les bons résultats, et de plus avec cette méthode j'ai l'impression que je peux m'abstenir du tri préalable des lettres, ce qui me ferai gagner temps/mémoire lors du chargement du dictionnaire bool stringD::isAnagram(stringD s)
{
if (size()>s.size()) return false;
for(unsigned i=0;i<size();++i)
{
unsigned pos=s.s2.find(s2[i]);
if(pos==std::string::npos) return false;
else s.s2.erase(pos,1);
}
return true;
}Merci encore !
La confiance n'exclut pas le contrôle |