user3388205
user3388205

Reputation: 27

return longest alphabetical substring

The aim of the program is to print the longest substring within variable s that is in alphabetical order.

s ='abchae'
currentlen = 0
longestlen = 0
current = ''
longest = ''
alphabet = 'abcdefghijklmnopqrstuvwxyz'

for char in s:

    for number in range(0,len(s)):
    if s[number] == char:
        n = number 

    nxtchar = 1        
    alphstring = s[n] 
    while alphstring in alphabet == True and n+nxtchar <= 5:
        alphstring += s[n+nxtchar]
        nxtchar += 1
        currentlen = len(alphstring)
        current = alphstring

        if currentlen > longestlen:
            longest = current

print longest 

When run, the program doesn't print anything. I don't seem to see what's wrong with the code. Any help would be appreciated.

Upvotes: 2

Views: 299

Answers (4)

user3099761
user3099761

Reputation: 139

This is my solution:

result = ""
s = 'abchae'
alphabet = 'abcdefghijklmnopqrstuvwxyz'
max_length=0
for i in range(len(s)):
    for j in range(len(s)):
        if s[i:j] in alphabet and len(s[i:j])>max_length:
            max_length = len(s[i:j])
            result = s[i:j]
print result

Upvotes: 0

GSalazar
GSalazar

Reputation: 166

I think I understood what you meant.

First you need to fix the indentation problem in your code, that would make it run:

for number in range(0,len(s)): if s[number] == char: n = number

Second, that condition will return two numbers 0 and 4 since a appears two times in s. I believe you only want the first so you should probably add a break statement after you find a match.

for number in range(0,len(s)): if s[number] == char: n = number break

Finally, alphstring in alphabet == True will always return False. Because alphabet will never be True, you need parentheses to make this work or remove the == True.

ex: while (alphstring in alphabet) == True and n+nxtchar <= 5:

I believe that you were looking for the string abch which is what I managed to obtain with these changes

Upvotes: 0

Fei Yuan
Fei Yuan

Reputation: 82

Like Kasramvd said, I do not understand the logic behind your code. You sure your code can run without raise IndentationError? As I concerned, the following part (the second row, have wrong indentation).

for number in range(0,len(s)): if s[number] == char: n = number

If you fixed that indentation error, you can run you code without error, and the last row (print longest) does work, it just does not work as you expect, it only prints a blank line.

Upvotes: 0

Joseph Stover
Joseph Stover

Reputation: 427

I'd use regex for this

import re
string = 'abchae'
alphstring = re.compile(r'a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*', re.I)

longest = ''
for match in alphstring.finditer(string):
    if len(match.group()) > len(longest):
        longest = match.group()

print(longest)

Output:

abch

Note: The flag re.I in the regex expression causes the regex to ignore case. If this is not the desired behavior you can delete the flag and it will only match lowercase characters.

Upvotes: 3

Related Questions