具体算法如下:
using System;
namespace stringsearch
{
/// <summary>
/// 字符串搜索的基本抽象类
/// </summary>
public abstract class StringSearchTool
{
public enum Search
{
NOT_FOUND,
SEARCH_EXACT,
SEARCH_CASELESS
}
protected Search search;
protected String pattern;
public string Pattern
{
get
{
return pattern;
}
set
{
//大小写暂时无用处
if(search==Search.SEARCH_CASELESS)
{
pattern=value;
pattern.ToUpper();
}
else
{
pattern=value;
}
}
}
public StringSearchTool()
{
search=Search.SEARCH_CASELESS;
pattern=null;
}
public StringSearchTool(string p)
{
search=Search.SEARCH_CASELESS;
pattern=p;
}
public StringSearchTool( string p,Search type)
{
search=type;
pattern=p;
}
public int getPatternLength()
{
return pattern.Length;
}
public Search getSearchType()
{
return search;
}
public int find(string target)
{
return find(target,0);
}
public abstract int find(string target, int start);
}
}
BoyerMoore算法
using System;
namespace stringsearch
{
/// <summary>
///
/// </summary>
public class BoyerMoore : stringsearch.StringSearchTool
{
protected int [] delta;
private static readonly int DELTA_SIZE=65536;
public BoyerMoore():base()
{
}
public BoyerMoore(string p):base(p)
{
}
public BoyerMoore(string p,Search type):base(p,type)
{
}
public override int find(string target,int start)
{
if((pattern==null)||(start<0))
return (int)Search.NOT_FOUND;
String target2;
//if(search==Search.SEARCH_CASELESS)
// target2=target.ToUpper();
//else
target2=target;
int t=start+pattern.Length;
while(t<=target2.Length)
{
int p=pattern.Length;
while(pattern[p-1]==target2[t-1])
{
if(p>1)
{
--p;
--t;
}
else
{
return t-1;
}
}
t+=delta[(int)target2[t-1]];
}
return (int)Search.NOT_FOUND;
}
public new string Pattern
{
get
{
return base.Pattern;
}
set
{
base.Pattern=value;
int n;
delta=new int[DELTA_SIZE];
for(n=0;n<DELTA_SIZE;++n)
delta[n]=pattern.Length;
for(n=1;n<pattern.Length;++n)
delta[(int)pattern[n-1]]=pattern.Length-n;
delta[(int)pattern[pattern.Length-1]]=1;
}
}
}
}
测试代码(部分):
private void button1_Click(object sender, System.EventArgs e)
{
String terget=label1.Text;
String pattern=textBox1.Text;
BoyerMoore bm=new BoyerMoore();
bm.Pattern=pattern;
if (bm.find(terget,0)>0)
MessageBox.Show(this,"你是不是在找 "+pattern+" ?"+"恭喜你找到了!");
else
MessageBox.Show(this,"下面的这段话中没有找到你所查找的文字!");
}
编译已通过,在上面的设计中有一些小的漏洞,朋友可以修改以下.