回溯:
const char * MyStrStr( const char * text, const char * pattern)
2
{
3 int i = 0 , j = 0 ;
4
5 while (pattern[i] && text[j])
6
{
7 if (pattern[i] == text[j])
8
{
9 ++ i;
10 ++ j;
11 }
12 else
13
{
14 i = 0 ;
15 j = j - i + 1 ;
16 }
17 } // while
18
19 if ( ! pattern[i])
20
{
21 return text + j - i;
22 }
23 else
24
{
25 return 0 ;
26 }
27 }
不回溯:
#include < cstring >
2 int BM( const char * text, const char * pattern)
3
{
4 int arrShiftTable[ 256 ];
5 int tLen = strlen(text);
6 int pLen = strlen(pattern);
7 int currPos, tReadPos, pReadPos;
8
9 // exclude NUL
10 for ( int i = 1 ; i < sizeof arrShiftTable / sizeof ( int ); i ++ )
11
{
12 arrShiftTable[i] = pLen;
13 }
14
15 // exclude the last char in pattern
16 for ( int i = 0 ; i < pLen - 1 ; i ++ )
17
{
18 arrShiftTable[pattern[i]] = pLen - 1 - i;
19 }
20
21
for (currPos = pLen - 1 ; currPos < tLen; /**/ /* null */ )
22
{
23 for (pReadPos = pLen - 1 , tReadPos = currPos;
24 pReadPos >= 0 && pattern[pReadPos] == text[tReadPos];
25 pReadPos -- , tReadPos -- )
26
/**/ /* null */ ;
27
28 if (pReadPos < 0 )
29
{
30 return tReadPos + 1 ;
31 }
32 else
33
{
34 currPos += arrShiftTable[text[currPos]];
35 }
36
37 } // outer for
38
39 return - 1 ;
40 }