#!/usr/bin/env python
# -*- coding: utf-8 -*-
def reverse(ans):
res = []
for i in range(len(ans),0,-1):
res.append(ans[i-1])
return res
def array_to_string(terms):
ans = ""
for i in range(len(terms),0,-1):
idx = terms[i-1]
if ans == "":
ans = idx
else:
ans += (" "+idx)
return ans
def array_to_string_align_result(at1,at2,align_result):
at1_string = array_to_string(at1)
at2_string = array_to_string(at2)
if at1_string == "":at1_string = "[NULL]"
if at2_string == "":at2_string = "[NULL]"
align_result.append([at1_string,at2_string])
def align(qa,qb):
term_a_list = qa.split(" ")
term_b_list = qb.split(" ")
term_a_list_size = len(term_a_list)
term_b_list_size = len(term_b_list)
c=[[0 for x in range(term_b_list_size+1)] for y in range(term_a_list_size+1)]
b=[[0 for x in range(term_b_list_size+1)] for y in range(term_a_list_size+1)]
for i in range(1,term_a_list_size+1):
for j in range(1,term_b_list_size+1):
if cmp(term_a_list[i-1],term_b_list[j-1]) == 0 :
c[i][j] = c[i-1][j-1] + 1
b[i][j] = 0
elif c[i-1][j] >= c[i][j-1]:
c[i][j] = c[i-1][j]
b[i][j] = 1
else:
c[i][j] = c[i][j-1]
b[i][j] = 2
i = term_a_list_size
j = term_b_list_size
at1 = []
at2 = []
align_result = []
while ( i >0 and j > 0):
if b[i][j] == 0:
if len(at1) > 0 or len(at2) > 0 :
array_to_string_align_result(at1,at2,align_result)
at1 = []
at2 = []
align_result.append([term_a_list[i-1],term_b_list[j-1]])
i -= 1
j -= 1
elif b[i][j] == 1:
at1.append(term_a_list[i-1])
i-=1
elif b[i][j] == 2:
at2.append(term_b_list[j-1])
j -=1
while i > 0:
at1.append(term_a_list[i-1])
i -= 1
while j > 0 :
at2.append(term_b_list[j-1])
j -= 1
if len(at1) > 0 or len(at2) > 0:
array_to_string_align_result(at1,at2,align_result)
at1 = []
at2 = []
return reverse(align_result)
def Unit_Test(qa,qb):
print"----------------------------"
ans = align(qa,qb)
print qa+"\n"+qb
print"----------------------------"
for idx in ans:
print idx[0]+"-->"+idx[1]
print "---------------------------"
if __name__ == '__main__':
# -*- coding: utf-8 -*-
def reverse(ans):
res = []
for i in range(len(ans),0,-1):
res.append(ans[i-1])
return res
def array_to_string(terms):
ans = ""
for i in range(len(terms),0,-1):
idx = terms[i-1]
if ans == "":
ans = idx
else:
ans += (" "+idx)
return ans
def array_to_string_align_result(at1,at2,align_result):
at1_string = array_to_string(at1)
at2_string = array_to_string(at2)
if at1_string == "":at1_string = "[NULL]"
if at2_string == "":at2_string = "[NULL]"
align_result.append([at1_string,at2_string])
def align(qa,qb):
term_a_list = qa.split(" ")
term_b_list = qb.split(" ")
term_a_list_size = len(term_a_list)
term_b_list_size = len(term_b_list)
c=[[0 for x in range(term_b_list_size+1)] for y in range(term_a_list_size+1)]
b=[[0 for x in range(term_b_list_size+1)] for y in range(term_a_list_size+1)]
for i in range(1,term_a_list_size+1):
for j in range(1,term_b_list_size+1):
if cmp(term_a_list[i-1],term_b_list[j-1]) == 0 :
c[i][j] = c[i-1][j-1] + 1
b[i][j] = 0
elif c[i-1][j] >= c[i][j-1]:
c[i][j] = c[i-1][j]
b[i][j] = 1
else:
c[i][j] = c[i][j-1]
b[i][j] = 2
i = term_a_list_size
j = term_b_list_size
at1 = []
at2 = []
align_result = []
while ( i >0 and j > 0):
if b[i][j] == 0:
if len(at1) > 0 or len(at2) > 0 :
array_to_string_align_result(at1,at2,align_result)
at1 = []
at2 = []
align_result.append([term_a_list[i-1],term_b_list[j-1]])
i -= 1
j -= 1
elif b[i][j] == 1:
at1.append(term_a_list[i-1])
i-=1
elif b[i][j] == 2:
at2.append(term_b_list[j-1])
j -=1
while i > 0:
at1.append(term_a_list[i-1])
i -= 1
while j > 0 :
at2.append(term_b_list[j-1])
j -= 1
if len(at1) > 0 or len(at2) > 0:
array_to_string_align_result(at1,at2,align_result)
at1 = []
at2 = []
return reverse(align_result)
def Unit_Test(qa,qb):
print"----------------------------"
ans = align(qa,qb)
print qa+"\n"+qb
print"----------------------------"
for idx in ans:
print idx[0]+"-->"+idx[1]
print "---------------------------"
if __name__ == '__main__':