FH_Mad_SWF
FH_Mad_SWF

Reputation: 15

Trouble trying to find length of longest substring

I wrote the following code. It should return to me the length of the longest subscript in a string without a repeat in letters.

def lengthOfLongestSubstring(s):
    lst = []
    y = 0
    final = 0
    count = len(s)      
    while len(s) > 0:
        s = s[y:]            
        for i in range(len(s)):
            if s[i] in lst:
                y += 1
                count = len(lst)
                lst =[]
                break
            else:
                lst.append(s[i])

        if count > final:
            final=count 
    return(final)

when entering the string "tmmzuxt" i expect to get an output of 5 (length of "mzuxt") but instead get 4. I have debugged to figure out the problem seems to be that my function skips over the second 'm' when indexing but I can't figure out why. Any suggestions?

Realized I somehow missed a line. Hope this makes more sense.

Upvotes: 1

Views: 165

Answers (5)

Skyrider Feyrs
Skyrider Feyrs

Reputation: 92

I'm not sure if I understand your code, or if the while loop is needed here, actually. Try this instead:

def lengthOfLongestSubstring(s):
    max_length = 0
    length = 0
    previous = ''
    for thisCharacter in s:
        if thisCharacter != previous:
            length += 1
        else:
            max_length = max(length, max_length)
            length = 1
    return max_length

Upvotes: 1

Yash verma
Yash verma

Reputation: 66

here, in your code(line 7) you are updating your string value inside function, everytime your for loop iterates. for e.g., after every break inside for loop. you string(which is "tmmzuxt") is becoming short and short.

i created a new variable which contains your original string.

def lengthOfLongestSubstring(s):
    lst = []
    y = 0
    final = 0
    count = len(s)
    main_string = s;#change done here
    while len(s) > 0:
        
        s = main_string[y:] #change done here
        for i in range(len(s)):
            if s[i] in lst:
                y += 1
                count = len(lst)
                lst =[]
                break
            else:
                lst.append(s[i])
            
        if count > final: 
            final =count
            print(final)
    return(final)

lengthOfLongestSubstring("tmmzuxt")

Upvotes: 2

eandklahn
eandklahn

Reputation: 577

Your issue here is that you are modifying s while you are running your code. Consider that in the first iteration, you are getting s = s[0:], so s will now be 'tmmzuxt'. In your next iteration, you are getting s = s[1:], from the modified s. This is still not a problem, because you just get 'mmzuxt'. However, in your third iteration, you are getting s = s[2:], which is now 'zuxt'. So you need a different variable than s to hold the substring of s that you are actually testing.

Upvotes: 2

Erik McKelvey
Erik McKelvey

Reputation: 1627

The main problem with your code is that you incremented y, even though it should only ever remove the first character. There is no need for a variable y. Try this:

def lengthOfLongestSubstring(s):
    final = 0
    while len(s) > 0:
        count = len(s)
        lst = []
        for i in range(len(s)):
            if s[i] in lst:
                count = i - 1
                break
            lst.append(s[i])
        if count > final:
            final = count
        s = s[1:]
    return final

print(lengthOfLongestSubstring("tmmzuxt"))

Upvotes: 1

AziMez
AziMez

Reputation: 2082

Here is an edited code. removing #lst =[] and #break lines.

[Code]

def lengthOfLongestSubstring(s):
    lst = []
    y = 0
    final = 0
    count = len(s)      
    while len(s) > 0:
        s = s[y:]            
        for i in range(len(s)):
            if s[i] in lst:
                y += 1
                count = len(lst)
                #lst =[]
                #break
            else:
                lst.append(s[i])

        if count > final:
            final=count 
    return(final)

s="tmmzuxt"
print(lengthOfLongestSubstring(s))

[Output]

5

Upvotes: 1

Related Questions