[Tutor] longest common substring

Peter Otten __peter__ at web.de
Thu Nov 10 18:21:54 CET 2011


lina wrote:

> Hi,
> 
> I tested the one from
> 
http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Longest_common_substring
> 
> mainly:
> 
> #!/usr/bin/python3
> 
> a=['1','2','3','7']
> 
> b=['2','3','7']
> 
> def LongestCommonSubstring(S1, S2):
>         M = [[0]*(1+len(S2)) for i in range(1+len(S1))]
>         longest, x_longest = 0, 0
>         for x in range(1,1+len(S1)):
>                 for y in range(1,1+len(S2)):
>                         M[x][y] = M[x-1][y-1]+1
>                         if M[x][y] > longest:
>                                 longest = M[x][y]
>                                 x_longest = x
>                         else:
>                                 M[x][y] = 0
>         return S1[x_longest-longest:x_longest]
> 
> 
> if __name__=="__main__":
>         print(LongestCommonSubstring(a,b))
> 
> $ python3 LongestCommonSubstring.py
> ['1', '2', '3']
> 
> The results isn't right.

That's not the code from the site you quote. You messed it up when you tried 
to convert it to Python 3 (look for the suspicious 8-space indent)

Hint: the function doesn't contain anything specific to Python 2 or 3, apart 
from the xrange builtin. If you add the line

xrange = range

to your code the unaltered version will run in Python 3 -- and produce the 
correct result:

$ cat longest_common_substring3.py
xrange = range

def LongestCommonSubstring(S1, S2):
    M = [[0]*(1+len(S2)) for i in xrange(1+len(S1))]
    longest, x_longest = 0, 0
    for x in xrange(1,1+len(S1)):
        for y in xrange(1,1+len(S2)):
            if S1[x-1] == S2[y-1]:
                M[x][y] = M[x-1][y-1] + 1
                if M[x][y]>longest:
                    longest = M[x][y]
                    x_longest  = x
            else:
                M[x][y] = 0
    return S1[x_longest-longest: x_longest]

if __name__ == "__main__":
    a = ['1','2','3','7']
    b = ['2','3','7']

    print(LongestCommonSubstring(a, b))
$ python3 longest_common_substring3.py
['2', '3', '7']




More information about the Tutor mailing list