T = input text
P = pattern (that we need to find in the text T)
T[i] = the i-th character of T
P[j] = the j-th characetr of P
T[i] == P[j] means: check if the i-th character of T and
the j-th characetr of P are equal.
|
|
|
|
|
|
Observations: (what we learned from the above examples)
|
while ( not all characters matched )
{
if ( T[i] == P[j] )
{
/* --------------------------------------
Try to match NEXT pair of characters
-------------------------------------- */
i++;
j++;
if ( j == P.length )
{
P has been found !
(You can quit, or keep going to find another match)
}
}
....
}
|
|
|
|
i0 = i - j
|
Example:
|
|
Example:
i = i - j + 1;
j = 0;
|
$64,000 question:
|
|
Example:
|
i0 = i0 + 1; // Move pattern P one character further
i = i0; // Restart matching at position i0 in T
j = 0; // Restart matching at position 0 in P
|
i = i - j + 1;
j = 0;
achieves the same rsult as:
i0 = i0 + 1; // Move pattern P one character further
i = i0; // Restart matching at position i0 in T
j = 0; // Restart matching at position 0 in P
because:
i0 is equal to i - j
|
Basic( T, P )
{
int i0, i, j, m, n;
n = T.length();
m = P.length();
i0 = 0; // Line P up with the first character of T
i = 0; // Start matching with first char in T
j = 0; // Start matching with first char in P
while ( i < n ) // Not all characters used
{
if ( T[i] == P[j] )
{
i++; // Match next pair
j++;
if ( j == m )
return ( i0 ); // Match found at position i0 !!!
}
else
{ /* ===========================================
P does not start at position i0...
Try another position by moving P further
=========================================== */
i0 = i0 + 1; // Move pattern P one character further
i = i0; // Restart matching at position i0 in T
j = 0; // Restart matching at position 0 in P
}
}
return -1; // No match found
}
|
How to run the program:
|