70 lines
2.4 KiB
Python
70 lines
2.4 KiB
Python
#!/usr/bin/python
|
|
|
|
# Solution to the LGIS Rosalind Problem - Longest Increasing Subsequence
|
|
# Author: Peter Vlasveld
|
|
# Date: 18/01/2019
|
|
import copy
|
|
|
|
#get input
|
|
f1 = open("rosalind_lgis.txt")
|
|
content = f1.readlines()
|
|
f1.close()
|
|
|
|
#get array out of content
|
|
arr = content[1].split( )
|
|
|
|
#function to find longest increasing subsequence of arr
|
|
def inc (arr):
|
|
#set s array to a list of a list of the first value in arr
|
|
s = [[arr[0]]]
|
|
#loop through arr skipping the first value
|
|
for i in xrange(1,len(arr)):
|
|
#if this arr value is greater than the last element in the last list of s,
|
|
# then duplicate the last list and append the new value
|
|
if int(arr[i]) > int(s[len(s)-1][len(s[len(s)-1])-1]):
|
|
tempLis = copy.deepcopy(s[len(s)-1])
|
|
tempLis.append(arr[i])
|
|
s.append(tempLis)
|
|
#else if the first list of s is greater than the arr value, make the arr value the new first list
|
|
elif int(s[0][0]) > int(arr[i]):
|
|
s[0] = copy.deepcopy([arr[i]])
|
|
#otherwise, find the list in s where the last value is less greater than the arr value,
|
|
# and replace it with the list before it, with the new value appended to the end
|
|
else:
|
|
for j in xrange(0, len(s)):
|
|
if int(arr[i]) < int(s[j][len(s[j])-1]):
|
|
s[j] = copy.deepcopy(s[j-1])
|
|
s[j].append(arr[i])
|
|
break
|
|
#return the last element of s which at this point is the longest increasing subsequence
|
|
return s[len(s)-1]
|
|
|
|
#find the longest decreasing subsequence
|
|
#the logic is the exact same as the above increasing function,
|
|
# just with all of the greater-than and less-than operators turned around
|
|
def dec (arr):
|
|
s = [[arr[0]]]
|
|
for i in xrange(1,len(arr)):
|
|
if int(arr[i]) < int(s[len(s)-1][len(s[len(s)-1])-1]):
|
|
tempLis = copy.deepcopy(s[len(s)-1])
|
|
tempLis.append(arr[i])
|
|
s.append(tempLis)
|
|
elif int(s[0][0]) < int(arr[i]):
|
|
s[0] = copy.deepcopy([arr[i]])
|
|
else:
|
|
for j in xrange(0, len(s)):
|
|
if int(arr[i]) > int(s[j][len(s[j])-1]):
|
|
s[j] = copy.deepcopy(s[j-1])
|
|
s[j].append(arr[i])
|
|
break
|
|
return s[len(s)-1]
|
|
|
|
#run the functions
|
|
inc = inc(arr)
|
|
dec = dec(arr)
|
|
|
|
#print the output to a file
|
|
f2 = open("output.txt", "w")
|
|
f2.write(" ".join(inc) + "\n")
|
|
f2.write(" ".join(dec))
|
|
f2.close() |