Skip to content

Commit 82ac89b

Browse files
daddou-matrekhleb
authored andcommittedAug 28, 2018
fix longestCommonSubstring() to handle unicode characters (trekhleb#129) (trekhleb#176)
1 parent e09d526 commit 82ac89b

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed
 

‎src/algorithms/string/longest-common-substring/__test__/longestCommonSubstring.test.js

+1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ describe('longestCommonSubstring', () => {
77
expect(longestCommonSubstring('', 'ABC')).toBe('');
88
expect(longestCommonSubstring('ABABC', 'BABCA')).toBe('BABC');
99
expect(longestCommonSubstring('BABCA', 'ABCBA')).toBe('ABC');
10+
expect(longestCommonSubstring('𐌵𐌵**ABC', '𐌵𐌵--ABC')).toBe('ABC');
1011
});
1112
});

‎src/algorithms/string/longest-common-substring/longestCommonSubstring.js

+11-8
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,20 @@
44
* @return {string}
55
*/
66
export 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

Comments
 (0)