Ordre dans chaine de caractere

Résolu
francouas Messages postés 16 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 21 décembre 2009 - 26 févr. 2009 à 10:40
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 - 27 févr. 2009 à 11:19
J'aimerai ecrire la fonction booléenne estCache(e : mot, code)
qui renvoie vrai si toutes les lettres du mot apparaissent dans le bon ordre à l'intérieur du code.
Exemples : estCache("demain", "abadabacemopaladin") ) vrai
estCache ("demain", "abadabacmopaladin") ) faux


ma methode est imcomplète pour l'instant


dans l'idée je compare les deux chaines avec une boucle
si égale alors l'ordre est respecté
si pas égale alors pas d'ordre (mais faut il continuer dans la boucle ?)


j'aimerai utiliser length et compareTo


vous avez une idée ?

16 réponses

RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
27 févr. 2009 à 01:09
bon comme l'a dit sharpMao ici c'est l'algo qui importe et pas le langage. Tu devrais poser la question si tu avais un probleme avec le langage plutot (genre tu proposes l'algo et on t'aiderait a traduire en c#).
Enfin bon si vraiment tu ne comprends, je propose une solution qui devrait fonctionner. ce n'est guère la plus simple (je pense que lyle a en tête d'autres choses bcp plus simple mais bon c'est une solution malgré tout):

Appel de la fonction:

bool test = EstCache("EddMddedLdddIdNdEd", "emeline");
if (test)
  MessageBox.Show("L'ordre est respecté");
else
  MessageBox.Show("L'ordre n'est pas respecté");

Fonction :

private bool EstCache(string toParse, string mot)
{
    //pour ne pas prendre en compte la casse
    toParse = toParse.ToLowerInvariant();
    mot = mot.ToLowerInvariant();

    bool ordre = true;

    //le caractere que l'on doit rencontrer pour respecter l'ordre
    char doitRencontrer = mot[0];

    for (int j = 0; j < toParse.Length; j++ )
    {
        //si le caractere est différent de celui que l'on doit rencontrer
        if (toParse[j] != doitRencontrer)
        {
            //et si le caractere fait parti du mot
            if (mot.Contains(toParse[j]))
            {
                //alors l'ordre n'a pas été respecté
                ordre = false;
                break;
            }
        }
        else
        {
            //si le caractere est égal a celui que l'on doit rencontrer alors
           //on recupere le caractere suivant (j'ai utilisé substring ici juste pour ne pas utiliser un autre variable i qui serait un compteur que j'incrementerai pour passer au caractere suivant
            if (mot.Length > 1)
            {
                mot = mot.Substring(1);
                doitRencontrer = mot[0];
            }
        }
    }

    return ordre;
}
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
27 févr. 2009 à 08:58
Voici donc ma contribution:

private
static
bool AllContainedInOrder(
string w1,
string w2)
{
  
if (!
String.IsNullOrEmpty(w1))
   {

      int indexOf = -1;
     
if ((indexOf = w2.IndexOf(w1[0])) > -1)
      {
        
return AllContainedInOrder(w1.Substring(1), w2.Substring(indexOf));
      }
     
else
return
false;
   }
  
return
true;
}

Console
.WriteLine(AllContainedInOrder(
"demain",
"abadabacemopaladin"));

Console.WriteLine(AllContainedInOrder(
"demain",
"abadabacmopaladin"));

<hr />
-Blog-
-Site Perso-
3
Lyle56 Messages postés 240 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 19 juillet 2012 2
26 févr. 2009 à 11:13
Bonjour,

Une question :
Si tu recherche MAIN sur  une chaine " AtMtuANjIhyN "
Quel devrais être le résultat ?
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 févr. 2009 à 13:10
public





class





Program


{
  


public





static





void

Main(


string

[] args)
   {
     


Console

.WriteLine(AllContained(


"demain"

,


"abadabacemopaladin"

));
     


Console

.WriteLine(AllContained(


"demain"

,


"abadabacmopaladin"

));
   }

  


private





static





bool

AllContained(


string

w1,


string

w2)
  {
     


return

w1.ToCharArray().All(c => w2.Contains(c));
  }
}




<hr />
-Blog-
-Site Perso-
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
26 févr. 2009 à 13:23
Hello,

Désolé Bidou, mais avec ça, tu ne garantis pas l'ordre.

Quant à la réponse à ce problème, ça me gêne toujours un peu de donner une réponse à ce qui est probablement un problème d'école, et donc qui a pour but de faire réfléchir.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
francouas Messages postés 16 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 21 décembre 2009
26 févr. 2009 à 13:33
lyle..je ne comprend pas ta question
bidou, ce n'est pas l'objet du programme car il faut laisser saisir l'utilisateur et retourner une reponse en fonction des saisies

sharpM ..je ne demande pas forcement le programme mais au moins l'algo.
c'est un univers nouveau pour moi
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
26 févr. 2009 à 13:56
Mais c'est justement de trouver l'algo le but de l'exercice.
Si on te le donne, tu n'auras pas appris grand chose.

Apprendre la programmation, et l'algorithmique, c'est apprendre une manière de penser, et c'est pas sur des forum que tu vas la trouver.
C'est justement en commençant par ce genre de petit exercice que tu deviendras un bon développeur.

Donc en gros, il faut d'abord apprendre à marcher avant de courir.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
Lyle56 Messages postés 240 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 19 juillet 2012 2
26 févr. 2009 à 14:50
Francouas :

Ton algorithme ne serra pas le même dans le cas ou tu exclus la possibilité qu'une des lettres du mot soit présente avant que son occurrences apparaisse dans ton mot.
0
francouas Messages postés 16 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 21 décembre 2009
26 févr. 2009 à 14:56
je ne veux rien exclure.
tu veux dire que je ne peux pas tester lettre par lettre et verifier la condition ?
je m'y perd :-(
0
Lyle56 Messages postés 240 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 19 juillet 2012 2
26 févr. 2009 à 15:14
Tu est sur la bonne voie ;)

Une boucle
2 Tableaux avec 1 pointeur chaqu'un
1 avance tout le temps.
L'autre chaque fois que la lettre sur les deux pointeurs sont identiques ...

Il y as d'autres solutions... de tête j'en vois au moins 2 de plus...
0
francouas Messages postés 16 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 21 décembre 2009
26 févr. 2009 à 15:18
oups..pas vu encore les tableaux
pointeurs connais pas non plus

boucle ok
fonction length, compareTo aussi
forcement ce petit programme est sera limité dans sa difficulté.

je ne sais pas comment sortir de la boucle en fait
0
Lyle56 Messages postés 240 Date d'inscription jeudi 1 mai 2008 Statut Membre Dernière intervention 19 juillet 2012 2
26 févr. 2009 à 15:30
Il y as une solution sans tableau et avec seulement les fonctions de bases des strings mais c'est un peut plus compliqué ... et c'est toujours dans une boucle ;)
0
francouas Messages postés 16 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 21 décembre 2009
26 févr. 2009 à 15:39
je sèche la..
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
27 févr. 2009 à 08:19
SharpMao> Oups, j'avais pas lu qu'il fallait conserver l'ordre, mes excuses donc...

<hr />
-Blog-
-Site Perso-
0
francouas Messages postés 16 Date d'inscription mardi 24 février 2009 Statut Membre Dernière intervention 21 décembre 2009
27 févr. 2009 à 08:35
merci Rougail
je prend note de ta version même si je n'ai pas encore vu toutes les commandes que tu proposes (comme le break par ex)
j'ai eu une correction hier ..si ca vous interesse je la met en ligne
merci en tout cas pour votre disponibilité a tous
0
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
27 févr. 2009 à 11:19
Nan il semblerait que je n'ai pas compris la consigne non plus en fait ^^ (ma faute j'ai mal regardé l'exemple du début).
Ainsi EstCache("demain", "abadabacemopaladin") renverra faux alors que selon ton exo elle devrait renvoyer vrai.
Je pensais qu'il fallait absolument rencontrer les caracteres dans l'ordre, a savoir que si on rencontrait un "a" (caractere présent dans le mot) avant le "d" alors cela renverrait faux.

Désolé pour le misunderstanding! donc valide plutot la solution de bidou et annuler la mienne ^^
0
Rejoignez-nous