c#实现sunday算法实例
本文导语: 因正则表达式搜索总是出现死循环,开始考虑改为其他搜索方式,因为.net自带的IndexOf默认只能找到第一个或最后一个,如果要把全部的匹配项都找出来,还需要自己写循环SubString,所以想找下有没有现成的,就发现了在这个...
因正则表达式搜索总是出现死循环,开始考虑改为其他搜索方式,因为.net自带的IndexOf默认只能找到第一个或最后一个,如果要把全部的匹配项都找出来,还需要自己写循环SubString,所以想找下有没有现成的,就发现了在这个领域里,BM算法是王道,而sunday算法据说是目前最好的改进版,这一点我没有从国外的网站尤其是wiki上找到印证,但中文谈论sunday的文章很多,我就姑且认为它是最好的吧。
public static int SundaySearch(string text, string pattern)
{
int i = 0;
int j = 0;
int m = pattern.Length ;
int matchPosition = i;
while (i < text.Length && j < pattern.Length)
{
if (text[i] == pattern[j])
{
i++;
j++;
}
else
{
if(m==text.Length-1)break;
int k = pattern.Length - 1;
while (k >= 0 && text[m ] != pattern[k])
{
k--;
}
int gap = pattern.Length - k;
i += gap;
m = i + pattern.Length;
if (m > text.Length) m = text.Length - 1;
matchPosition = i;
j = 0;
}
}
if (i