|
|
|
|
|
|
|
|
int bruteForce(string T, string P, int s) // s = start position
{
int n = T.length(), m = P.length();
int j = 0; // Start match with character pos = 0
while ( s+(m-1) < n ) // Last char pos in P is valid character in T
{
if ( P[j] == T[s+j] )
{
j++; // Continue with next character
if ( j == m )
return(s); // Pattern found at pos s
}
else
{
s += 1; // Use next shift position
j = 0; // reset to 1st char in pattern to match
}
}
return -1; // Pattern not found
}
|
int KMP(string T, string P, int s) // s = start position { int n = T.length(), m = P.length(); int j = 0; // Start match with character pos = 0 while ( s+(m-1) < n ) // Last char pos in P is valid character in T { if ( P[j] == T[s+j] ) { j++; // Continue with next character if ( j == m ) return(s); // Pattern found at pos s } else { string pre = P.substr(0, j); s += max(1, len(pre) - MaxOverlap(pre)); j = 0; // reset to 1st char in pattern to match } } return -1; // Pattern not found } |
int MaxOverlap(string s)
{
for (int k = s.length()-1; k >= 1; k--)
{
string s1 = s.substr(0, k);
string s2 = s.substr(s.length()-k, s.length());
if ( s1 == s2 )
return s1.length();
}
return 0;
}
|
Demo: Progs/kmp-1.cc
|
|
P: abacab
length prefix MaxOverlap(prefix) f(k)
---------------------------------------------------------------------
k = 0 "" "" f(k=0) = 0
k = 1 a "" f(k=1) = 0
k = 2 ab "" f(k=2) = 0
k = 3 aba a f(k=3) = 1
k = 4 abac "" f(k=4) = 0
k = 5 abaca a f(k=5) = 1
k = 6 abacab ab f(k=6) = 2
KMP failure function:
k = | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
----------+---+---+---+---+---+---+----
f(k) = | 0 | 0 | 0 | 1 | 0 | 1 | 2 |
|
DEMO: Progs/kmp-2.cc
int KMPFailureF[m]; // Initialized to -1, -1, -1, ...
int MaxOverlap(string s)
{
if ( KMPFailureF[s.length()] >= 0 )
return KMPFailureF[s.length()];
for (int k = s.length()-1; k >= 1; k--)
{
string s1 = s.substr(0, k);
string s2 = s.substr(s.length()-k, s.length());
if ( s1 == s2 )
{
KMPFailureF[s.length()] = s1.length();
return KMPFailureF[s.length()];
}
}
return 0;
}
|
DEMO: Progs/kmp-3.cc