Finite-State Automaton

Finite-State Automaton is a string searching algorithm.



									public static int[] SearchString(string str, string pat)
{
	List<int> retVal = new List<int>();
	int M = pat.Length;
	int N = str.Length;
	int i, state = 0;
	int[,] TF = new int[M + 1, 256];

	ComputeTF(pat, M, TF);

	for (i = 0; i < N; i++)
	{
		state = TF[state, str[i]];

		if (state == M)
		{
			retVal.Add(i - M + 1);
		}
	}

	return retVal.ToArray();
}

private static void ComputeTF(string pat, int M, int[,] TF)
{
	int state, x;

	for (state = 0; state <= M; ++state)
		for (x = 0; x < 256; ++x)
			TF[state, x] = GetNextState(pat, M, state, x);
}

private static int GetNextState(string pat, int M, int state, int x)
{
	if (state < M && x == pat[state])
		return state + 1;

	int ns, i;

	for (ns = state; ns > 0; ns--)
	{
		if (pat[ns - 1] == x)
		{
			for (i = 0; i < ns - 1; i++)
			{
				if (pat[i] != pat[state - ns + 1 + i])
					break;
			}

			if (i == ns - 1)
				return ns;
		}
	}

	return 0;
}
								


Example

									string data = "the quick brown fox jumps over the lazy dog";
int[] value = SearchString(data, "the");
								


Output

									0
31