1
+ function lcs ( wordX , wordY ) {
2
+
3
+ var m = wordX . length ,
4
+ n = wordY . length ,
5
+ l = [ ] ,
6
+ i , j , a , b ;
7
+
8
+ for ( i = 0 ; i <= m ; ++ i ) {
9
+ l [ i ] = [ ] ;
10
+ for ( j = 0 ; j <= n ; ++ j ) {
11
+ l [ i ] [ j ] = 0 ;
12
+ }
13
+ }
14
+
15
+ for ( i = 0 ; i <= m ; i ++ ) {
16
+ for ( j = 0 ; j <= n ; j ++ ) {
17
+ if ( i == 0 || j == 0 ) {
18
+ l [ i ] [ j ] = 0 ;
19
+
20
+ } else if ( wordX [ i - 1 ] == wordY [ j - 1 ] ) {
21
+ l [ i ] [ j ] = l [ i - 1 ] [ j - 1 ] + 1 ;
22
+
23
+ } else {
24
+ a = l [ i - 1 ] [ j ] ;
25
+ b = l [ i ] [ j - 1 ] ;
26
+ l [ i ] [ j ] = ( a > b ) ? a : b ; //max(a,b)
27
+ }
28
+ }
29
+ console . log ( l [ i ] . join ( ) ) ;
30
+ }
31
+
32
+ return l [ m ] [ n ] ;
33
+ }
34
+
35
+ //complete algorithm that prints the LCS as well
36
+
37
+ function lcs2 ( wordX , wordY ) {
38
+
39
+ var m = wordX . length ,
40
+ n = wordY . length ,
41
+ l = [ ] ,
42
+ solution = [ ] ,
43
+ i , j , a , b ;
44
+
45
+ for ( i = 0 ; i <= m ; ++ i ) {
46
+ l [ i ] = [ ] ;
47
+ solution [ i ] = [ ] ;
48
+ for ( j = 0 ; j <= n ; ++ j ) {
49
+ l [ i ] [ j ] = 0 ;
50
+ solution [ i ] [ j ] = '0' ;
51
+ }
52
+ }
53
+
54
+ for ( i = 0 ; i <= m ; i ++ ) {
55
+ for ( j = 0 ; j <= n ; j ++ ) {
56
+ if ( i == 0 || j == 0 ) {
57
+ l [ i ] [ j ] = 0 ;
58
+
59
+ } else if ( wordX [ i - 1 ] == wordY [ j - 1 ] ) {
60
+ l [ i ] [ j ] = l [ i - 1 ] [ j - 1 ] + 1 ;
61
+ solution [ i ] [ j ] = 'diagonal' ;
62
+
63
+ } else {
64
+ a = l [ i - 1 ] [ j ] ;
65
+ b = l [ i ] [ j - 1 ] ;
66
+ l [ i ] [ j ] = ( a > b ) ? a : b ; //max(a,b)
67
+
68
+ solution [ i ] [ j ] = ( l [ i ] [ j ] == l [ i - 1 ] [ j ] ) ? 'top' : 'left' ;
69
+ }
70
+ }
71
+ console . log ( l [ i ] . join ( ) ) ;
72
+ console . log ( solution [ i ] . join ( ) ) ;
73
+ }
74
+
75
+ printSolution ( solution , l , wordX , wordY , m , n ) ;
76
+
77
+ return l [ m ] [ n ] ;
78
+ }
79
+
80
+ function printSolution ( solution , l , wordX , wordY , m , n ) {
81
+
82
+ var a = m , b = n , i , j ,
83
+ x = solution [ a ] [ b ] ,
84
+ answer = '' ;
85
+
86
+ while ( x !== '0' ) {
87
+ if ( solution [ a ] [ b ] === 'diagonal' ) {
88
+ answer = wordX [ a - 1 ] + answer ;
89
+ a -- ;
90
+ b -- ;
91
+ } else if ( solution [ a ] [ b ] === 'left' ) {
92
+ b -- ;
93
+ } else if ( solution [ a ] [ b ] === 'top' ) {
94
+ a -- ;
95
+ }
96
+ x = solution [ a ] [ b ] ;
97
+ }
98
+
99
+ console . log ( 'lcs: ' + answer ) ;
100
+ }
101
+
102
+ var wordX = 'acbaed' ,
103
+ wordY = 'abcadf' ;
104
+
105
+ console . log ( lcs2 ( wordX , wordY ) ) ;
0 commit comments