2016-09-13 1 views
0

J'ai besoin d'un code pour trouver la plus longue sous-chaîne alphabétique dans une chaîne. Ce est le code que je utilise:Recherche de la plus longue sous-chaîne alphabétique dans une chaîne plus longue

letter = s[0]  
best = ''   
for n in range(1, len(s)):  
    if len(letter) > len(best): 
     best = letter 
    if s[n] >= s[n-1]: 
     letter += s[n]  
    else:      
     letter = s[n] 

Il fonctionne la plupart du temps, mais parfois il donne les mauvaises réponses et je suis confus pourquoi il ne fonctionne que parfois. par exemple lorsque:

s = 'maezsibmhzxhpprvx'

Il a dit que la réponse était "hpprv" alors qu'il aurait dû être "hpprvx".

Dans un autre cas, lorsque

s = 'ysdxvkctcpxidnvaepz'

Il a donné la réponse "CPX", quand il aurait dû être "aepz".

Que se passe-t-il ici?

+1

Votre code fonctionne parfaitement bien et a la sortie attendue. – RafaelC

+0

Il fonctionne, mais @EllaP dit clairement qu'il ne fait pas ce que l'on attendait parfois. –

+0

Si vous voyez les réponses ci-dessous avec le correctif, il est clair qu'il n'a pas toujours la sortie attendue. –

Répondre

1

Votre routine était presque ok, voici une petite comparaison entre le vôtre, fixe un et l'autre solution possible à votre problème:

def buggy(s): 
    letter = s[0] 
    best = '' 
    for n in range(1, len(s)): 
     if len(letter) > len(best): 
      best = letter 
     if s[n] >= s[n - 1]: 
      letter += s[n] 
     else: 
      letter = s[n] 

    return best 


def fixed(s): 
    letter = s[0] 
    best = '' 
    for n in range(1, len(s)): 
     if s[n] >= s[n - 1]: 
      letter += s[n] 
     else: 
      letter = s[n] 

     if len(letter) > len(best): 
      best = letter 

    return best 


def alternative(s): 
    result = ['' for i in range(len(s))] 
    index = 0 

    for i in range(len(s)): 
     if (i == len(s) - 1 and s[i] >= s[i - 1]) or s[i] <= s[i + 1]: 
      result[index] += s[i] 
     else: 
      result[index] += s[i] 
      index += 1 

    return max(result, key=len) 


for sample in ['maezsibmhzxhpprvx', 'ysdxvkctcpxidnvaepz']: 
    o1, o2, o3 = buggy(sample), fixed(sample), alternative(sample) 
    print "buggy={0:10} fixed={1:10} alternative={2:10}".format(o1, o2, o3) 

Comme vous pouvez le voir dans votre version de l'ordre de la boucle intérieure conditionnelle est pas bon, vous devez déplacer le premier conditionnel à la fin de la boucle.

3

Vous devez déplacer cette vérification

if len(letter) > len(best): 
    best = letter 

après le reste de la boucle

1

La logique est presque correct, sauf que si letter pousse sur la dernière itération de la boucle (quand n == len(s) - 1), best n'est pas changé cette dernière fois. Vous pouvez insérer une autre partie best = letter après la boucle, ou repenser soigneusement la structure du programme afin de ne pas vous répéter.

+1

En outre, vous pouvez considérer le cas où vous avez plusieurs sous-chaînes alphabétiques plus longues ... voulez-vous juste sélectionner le premier que vous rencontrez? Cela dépendra vraiment de votre application, mais cela vaut la peine d'examiner comment vous voulez gérer cette situation. –

+0

Absolument. Et en plus de cela, j'ai relu la question et j'ai juste pensé que le programme ne se soucie pas vraiment de l'alphabétique de la sous-chaîne. –