Suppression des doublons sur chaîne de caractère
Bonjour à tous,
Je viens vous faire part d'un sujet France IOI sur lequel je me casse les dents depuis un petit bout de temps.
L'idée est de supprimer les doublons tant qu'il y en a d'une chaîne de caractères. Ex:
baaabbacddc
baaabbacc
babbacc
babba
baa
b
Voici mon code avec lequel je ne réussit que 2 tests sur 14.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
morceau = input()
newMorceau = ""
while len(morceau) != len(newMorceau):
iNote = 0
while iNote < len(morceau):
if len(morceau) == 1:
newMorceau = morceau[iNote]
iNote+=1
elif len(morceau) == 2 and morceau[iNote] == morceau[iNote+1]:
newMorceau = ""
iNote+=2
elif len(morceau) == 2 and morceau[iNote] != morceau[iNote+1]:
newMorceau = morceau
iNote+=2
elif morceau[iNote] == morceau[iNote+1]:
newMorceau += morceau[iNote+2]
iNote+=3
else:
newMorceau += morceau[iNote]
iNote+=1
morceau = newMorceau
print(morceau) |
J'ai essayé plein de version avec des boucles en for et while mais rien n'y fait, je sèche complètement.
J'espère que quelqu'un pourra me mettre sur la voie.
Merci d'avance !!
Plus de précisions, car c'est pas clair
Salut.
Quelle logique devrait faire qu'on supprime d'abord le 'dd' de fin de chaîne, puis après 'aaa' devienne 'a' en début de chaîne ?
Qu'entends-tu par doublon ? Doublon pour moi signifie caractère présent plus d'une fois dans la chaîne.
Est-ce que par doublon tu entends deux mêmes caractères consécutif dans la chaîne ?
Puis quels sont les exemples de tests avec lesquels ton code se plante ?
Edit :
Si c'est bien une transformation en supprimant chaque double consécutif dans la chaîne, alors on pourrait faire ça en utilisant une liste pour stocker le résultat final, et de parcourir la chaîne de la fin vers le début. Ce qui pourrait donner.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| chaines = (
'baaabbacddc',
'oonnoliilkbnnbbh',
'obbaaaaabbbaccicdcdd',
)
def unifier(chaine) :
# Liste où seront stockés les caractères non consécutifs
list_cars = []
# Parcours des caractères de la chaîne de la fin vers le début
for car in chaine[::-1] :
try :
# On tente de récupérer le dernier caractère
dernier_car = list_cars[-1]
except IndexError :
# Il n'y pas encore de caratères dans la liste
# On ajoute celui en cours
list_cars.append(car)
# On saute au tour suivant de la boucle
continue
# Si le caractère courant est identique au dernier caractère de list_cars
if car == dernier_car :
# On le supprime de la liste
list_cars.pop()
else :
# On l'ajoute en fin de liste
list_cars.append(car)
# Retour de la liste convertie en str en inversant la liste
return ''.join(list_cars[::-1])
for chaine in chaines :
print(chaine, '=>', unifier(chaine)) |