user9571453
user9571453

Reputation: 13

Is it possible to achieve this without defining a function?

I'm trying to write a Python program which would take a string and print the longest substring in it which is also in alphabetical order. For example:

the_string = "abcdefgghhisdghlqjwnmonty" The longest substring in alphabetical order here would be "abcdefgghhis"

I'm not allowed to define my own functions and can't use lists. So here's what I came up with:

def in_alphabetical_order(string):
    for letter in range(len(string) - 1):
        if string[letter] > string[letter + 1]:
            return False
    return True    

s = "somestring"
count = 0

for char in range(len(s)):
    i = 0
    while i <= len(s):
        sub_string = s[char : i]
        if (len(sub_string) > count) and (in_alphabetical_order(sub_string)):
            count = len(sub_string)
            longest_string = sub_string
        i += 1

print("Longest substring in alphabetical order is: " + longest_string)

This obviously contains a function that is not built-in. How can I check whether the elements of the substring candidate is in alphabetical order without defining this function? In other words: How can I implement what this function does for me into the code (e.g. by using another for loop in the code somewhere or something)?

Upvotes: 1

Views: 71

Answers (3)

Evan Nowak
Evan Nowak

Reputation: 895

Here's a solution based off of what you had:

s = 'abcdefgghhisdghlqjwnmonty'

m, n = '', ''

for i in range(len(s) - 1):
    if s[i + 1] < s[i]:
        if len(n) > len(m):
            m = n
        n = s[i]
    else:
        n += s[i]

Output:

m

'abcdefgghhi'

Upvotes: 0

Adam  M.
Adam M.

Reputation: 1193

just going by your code you can move the operation of the function into the loop and use a variable to store what would have been the return value.

I would recommend listening to bill the lizard to help with the way you solve the problem

s = "somestring"
count = 0
longest_string = ''


for char in range(len(s)):
    i = 0
    while i <= len(s):
        sub_string = s[char : i]
        in_order = True

        for letter in range(len(sub_string) - 1):
            if sub_string[letter] > sub_string[letter + 1]:
                in_order = False
                break

        if (len(sub_string) > count) and (in_order):
            count = len(sub_string)
            longest_string = sub_string
        i += 1

print("Longest substring in alphabetical order is: " + longest_string)

Upvotes: 2

Bill the Lizard
Bill the Lizard

Reputation: 405745

You don't need to check the whole substring with a function call to see if it is alphabetical. You can just check one character at a time.

Start at the first character. If the next character is later in the alphabet, keep moving along in the string. When you reach a character that's earlier in the alphabet than the previous character, you've found the longest increasing substring starting at the first character. Save it and start over from the second character.

Each time you find the longest substring starting at character N, check to see if it is longer than the previous longest substring. If it is, replace the old one.

Upvotes: 1

Related Questions