44 * @return {string }
55 */
66export default function longestCommonSubstring ( s1 , s2 ) {
7+ // transform s1 & s2 into arrays to allow handling unicodes as single caracter.
8+ const [ a1 , a2 ] = [ s1 , s2 ] . map ( s => Array . from ( s ) ) ;
9+
710 // Init the matrix of all substring lengths to use Dynamic Programming approach.
8- const substringMatrix = Array ( s2 . length + 1 ) . fill ( null ) . map ( ( ) => {
9- return Array ( s1 . length + 1 ) . fill ( null ) ;
11+ const substringMatrix = Array ( a2 . length + 1 ) . fill ( null ) . map ( ( ) => {
12+ return Array ( a1 . length + 1 ) . fill ( null ) ;
1013 } ) ;
1114
1215 // Fill the first row and first column with zeros to provide initial values.
13- for ( let columnIndex = 0 ; columnIndex <= s1 . length ; columnIndex += 1 ) {
16+ for ( let columnIndex = 0 ; columnIndex <= a1 . length ; columnIndex += 1 ) {
1417 substringMatrix [ 0 ] [ columnIndex ] = 0 ;
1518 }
1619
17- for ( let rowIndex = 0 ; rowIndex <= s2 . length ; rowIndex += 1 ) {
20+ for ( let rowIndex = 0 ; rowIndex <= a2 . length ; rowIndex += 1 ) {
1821 substringMatrix [ rowIndex ] [ 0 ] = 0 ;
1922 }
2023
@@ -23,9 +26,9 @@ export default function longestCommonSubstring(s1, s2) {
2326 let longestSubstringColumn = 0 ;
2427 let longestSubstringRow = 0 ;
2528
26- for ( let rowIndex = 1 ; rowIndex <= s2 . length ; rowIndex += 1 ) {
27- for ( let columnIndex = 1 ; columnIndex <= s1 . length ; columnIndex += 1 ) {
28- if ( s1 [ columnIndex - 1 ] === s2 [ rowIndex - 1 ] ) {
29+ for ( let rowIndex = 1 ; rowIndex <= a2 . length ; rowIndex += 1 ) {
30+ for ( let columnIndex = 1 ; columnIndex <= a1 . length ; columnIndex += 1 ) {
31+ if ( a1 [ columnIndex - 1 ] === a2 [ rowIndex - 1 ] ) {
2932 substringMatrix [ rowIndex ] [ columnIndex ] = substringMatrix [ rowIndex - 1 ] [ columnIndex - 1 ] + 1 ;
3033 } else {
3134 substringMatrix [ rowIndex ] [ columnIndex ] = 0 ;
@@ -50,7 +53,7 @@ export default function longestCommonSubstring(s1, s2) {
5053 let longestSubstring = '' ;
5154
5255 while ( substringMatrix [ longestSubstringRow ] [ longestSubstringColumn ] > 0 ) {
53- longestSubstring = s1 [ longestSubstringColumn - 1 ] + longestSubstring ;
56+ longestSubstring = a1 [ longestSubstringColumn - 1 ] + longestSubstring ;
5457 longestSubstringRow -= 1 ;
5558 longestSubstringColumn -= 1 ;
5659 }
0 commit comments