File tree Expand file tree Collapse file tree 2 files changed +74
-0
lines changed Expand file tree Collapse file tree 2 files changed +74
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * Find the Longest Common Subsequence (LCS) of two strings.
3
+ * @param text1 - The first input string.
4
+ * @param text2 - The second input string.
5
+ * @returns The longest common subsequence as a string.
6
+ */
7
+
8
+ export const longestCommonSubsequence = ( text1 : string , text2 : string ) : string => {
9
+ const m = text1 . length ;
10
+ const n = text2 . length ;
11
+
12
+ // Create a 2D array to store the lengths of LCS
13
+ const dp : number [ ] [ ] = Array . from ( { length : m + 1 } , ( ) =>
14
+ Array ( n + 1 ) . fill ( 0 )
15
+ ) ;
16
+
17
+ // Fill in the DP table
18
+ for ( let i = 1 ; i <= m ; i ++ ) {
19
+ for ( let j = 1 ; j <= n ; j ++ ) {
20
+ if ( text1 [ i - 1 ] === text2 [ j - 1 ] ) {
21
+ dp [ i ] [ j ] = dp [ i - 1 ] [ j - 1 ] + 1 ;
22
+ } else {
23
+ dp [ i ] [ j ] = Math . max ( dp [ i - 1 ] [ j ] , dp [ i ] [ j - 1 ] ) ;
24
+ }
25
+ }
26
+ }
27
+
28
+ // Reconstruct the LCS from the DP table
29
+ let i = m ;
30
+ let j = n ;
31
+ const lcs : string [ ] = [ ] ;
32
+ while ( i > 0 && j > 0 ) {
33
+ if ( text1 [ i - 1 ] === text2 [ j - 1 ] ) {
34
+ lcs . unshift ( text1 [ i - 1 ] ) ;
35
+ i -- ;
36
+ j -- ;
37
+ } else if ( dp [ i - 1 ] [ j ] > dp [ i ] [ j - 1 ] ) {
38
+ i -- ;
39
+ } else {
40
+ j -- ;
41
+ }
42
+ }
43
+
44
+ return lcs . join ( '' ) ;
45
+ }
46
+
Original file line number Diff line number Diff line change
1
+ import { longestCommonSubsequence } from "../lcs" ;
2
+
3
+ describe ( "longestCommonSubsequence" , ( ) => {
4
+ it ( "should return the longest common subsequence" , ( ) => {
5
+ expect ( longestCommonSubsequence ( "ABCD" , "ACDF" ) ) . toBe ( "ACD" ) ;
6
+
7
+ expect ( longestCommonSubsequence ( "AGGTAB" , "GXTXAYB" ) ) . toBe ( "GTAB" ) ;
8
+
9
+ expect ( longestCommonSubsequence ( "abcdef" , "xyz" ) ) . toBe ( "" ) ;
10
+
11
+ expect ( longestCommonSubsequence ( "" , "" ) ) . toBe ( "" ) ;
12
+ } ) ;
13
+
14
+ it ( "should handle cases with spaces and special characters" , ( ) => {
15
+ expect ( longestCommonSubsequence ( "A B C D" , "A C D E" ) ) . toBe ( "A C D" ) ;
16
+
17
+ expect ( longestCommonSubsequence ( "1234$%^" , "!@#$%^" ) ) . toBe ( "$%^" ) ;
18
+ } ) ;
19
+
20
+ it ( "should handle cases with longer input strings" , ( ) => {
21
+ expect (
22
+ longestCommonSubsequence (
23
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit." ,
24
+ "Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
25
+ )
26
+ ) . toBe ( "e iumoor it t oeetr ag li." ) ;
27
+ } ) ;
28
+ } ) ;
You can’t perform that action at this time.
0 commit comments