File tree Expand file tree Collapse file tree 1 file changed +37
-0
lines changed Expand file tree Collapse file tree 1 file changed +37
-0
lines changed Original file line number Diff line number Diff line change
1
+ // Build a suffix array in O(n^2*log n);
2
+ // kinda too much, but now you can search for a pattern in O(n*log n) where `n` is number of characters in `str`
3
+ //
4
+ function searchPattern(str) {
5
+ var strLen = str.length;
6
+ var suffixArray = new Array(strLen);
7
+ var suffixes = new Array(strLen);
8
+
9
+ for (var i = strLen-1; i >= 0; i--) {
10
+ suffixes[i] = [i, str.substr(i)];
11
+ }
12
+
13
+ suffixes.sort(function(a, b) {
14
+ return a[1] < b[1] ? -1 : 1;
15
+ });
16
+
17
+ for (var i = 0; i < strLen; i++) {
18
+ suffixArray[i] = suffixes[i][0];
19
+ }
20
+
21
+ return function(pattern) {
22
+ var l = 0;
23
+ var r = strLen-1;
24
+ while (l <= r) {
25
+ var mid = (l + r) >> 1;
26
+ var cmp = pattern.localeCompare( suffixes[suffixArray[mid]][1] );
27
+ if (cmp === 0) {
28
+ return mid;
29
+ } else if (cmp > 0) {
30
+ l = mid + 1;
31
+ } else {
32
+ r = mid - 1;
33
+ }
34
+ }
35
+ return -1;
36
+ }
37
+ }
You can’t perform that action at this time.
0 commit comments