forked from TheAlgorithms/JavaScript
- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathKMPPatternSearching.js
More file actions
Latest commit
55 lines (48 loc) · 1.42 KB
/
Copy pathKMPPatternSearching.js
File metadata and controls
55 lines (48 loc) · 1.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Implementing KMP Search Algorithm to search all the instances of pattern in
// given text
// Reference Book: Introduction to Algorithms, CLRS
// Explanation: https://www.topcoder.com/community/competitive-programming/tutorials/introduction-to-string-searching-algorithms/
constcomputeLPS=(pattern)=>{
constlps=Array(pattern.length)
lps[0]=0
for(leti=1;i<pattern.length;i++){
letmatched=lps[i-1]
while(matched>0&&pattern[i]!==pattern[matched]){
matched=lps[matched-1]
}
if(pattern[i]===pattern[matched]){
matched++
}
lps[i]=matched
}
returnlps
}
/**
* Returns all indices where pattern starts in text
* @param {*} text a big text in which pattern string is to find
* @param {*} pattern the string to find
*/
constKMPSearch=(text,pattern)=>{
if(!pattern||!text){
return[]// no results
}
// lps[i] = length of proper prefix of pattern[0]...pattern[i-1]
// which is also proper suffix of it
constlps=computeLPS(pattern)
constresult=[]
letmatched=0
for(leti=0;i<text.length;i++){
while(matched>0&&text[i]!==pattern[matched]){
matched=lps[matched-1]
}
if(text[i]===pattern[matched]){
matched++
}
if(matched===pattern.length){
result.push(i-pattern.length+1)
matched=lps[matched-1]
}
}
returnresult
}
export{KMPSearch}