2010-07-03 6 views
0

Je souhaite écrire une méthode pour déterminer si une chaîne donnée est un palindrome. Par exemple. "Madame je suis Adam", ou "Un homme, un plan, un canal, Panama".Logique de codage C++ - Diverses idées

Le prototype de la fonction est:

bool is_palindrome(char const * str) 

J'ai une logique simple pour vérifier l'égalité en aller de l'avant vers l'arrière & des extrémités extrêmes de la chaîne. Mais, je voudrais savoir combien de façons efficaces de le faire? Toutes les idées sont bienvenues de la part des gourous C++ ..

+0

Il y a http://stackoverflow.com/questions/248161/palindrome-detection-efficiency et http://stackoverflow.com/questions/228518/palindrome-golf. Dup possible? – pmr

+0

Notez que vos deux exemples ne sont que des palindromes si vous ignorez rigoureusement l'espace blanc, la ponctuation et la casse (une condition presque universelle, BTW). Comment cela affectera-t-il votre approche? Est-ce que le code vaut pour les variantes qui en appliquent un ou plusieurs? Comment feriez-vous cela? Pouvez-vous fournir une interface propre à toutes les combinaisons possibles? Une fois que vous avez fait cela, * alors * vous comprenez votre problème. À votre santé. – dmckee

Répondre

1

Je ne pense pas qu'il y ait un moyen beaucoup plus efficace, vous devez comparer chaque caractère de la chaîne.

Optimisations possibles: Il suffit de vérifier la première moitié de la chaîne, et vous pouvez sortir prématurément dès que vous trouvez une discordance.

bool is_palindrome(char const * str) 
{ 
    size_t len = strlen(str); 
    bool isPalindrome = false; // It's debatable if a blank string is a palindrome or not 

    for(int i = 0; i < len/2; i++) 
    { 
     if(str[i] != str[len - i - 1]) 
     { 
      isPalindrome = false; 
      break; 
     } 
     isPalindrome = true; 
    } 

    return isPalindrome; 
} 
+0

Le code compilé peut être plus strict si le code source utilise deux pointeurs au lieu d'un indexeur de tableau; par exemple. 'if (* startPtr ++! = * endPtr--) {...}' – ChrisW