实现一个挺高级的字符匹配算法:
给一串很长字符串,要求找到符合要求的字符串,例如目的串:123
1******3***2 ,12*****3 这些都要找出来
其实就是类似一些和谐系统。。。。。
这题的真正意思就是,给你一个目标串,如“123”,只要一个字符串里面同时包含1、2和3,那么这个字符串就匹配了。系统越和谐,说明错杀的可能行也就越大。加入目标串的长度为m,模式串的长度为n,我们很容易想到O(mn)的算法,就是两遍for循环搞定。那么有没有更快的方法呢?
可以采用哈希表
/************************************************************************/
/* 字符串匹配
对于一个字符串strDest=123,若字符串strSrc中包含1,2,3则两字符串匹配
要求复杂度为O(n)
方法:针对StrSrc建立哈希表,strDest查询哈希表判断是否匹配*/
/************************************************************************/
#include<iostream>
using namespace std;
class CHashTable
{
private:
char hash[255];//哈希数组
bool flag;//标记匹配
public:
CHashTable();
~CHashTable();
void SearchHash(char *Dest);//在哈希表中查找
void CreateHash(char *str);//建立哈希表
void Show();//输出哈希表
};
CHashTable::CHashTable()
{
int i;
for(i=0;i<255;i++)
{
hash[i]=NULL;
}
flag=true;
}
CHashTable::~CHashTable()
{
}
int HashFunc(char ch)
{
return ch%255;
}
void CHashTable::CreateHash(char *str)
{
char *p=str;
while(*p!='\0')//建立哈希表
{
int k=HashFunc(*p);
if(hash[k]==NULL)//如果哈希表中有该元素则不加入,去重操作
hash[k]=*p;
p++;
}
}
void CHashTable::Show()
{
int i;
for(i=0;i<255;i++)
{
if(hash[i]!=NULL)
cout<<" "<<hash[i];
}
}
void CHashTable::SearchHash(char *Dest)
{
char *p=Dest;
while(*p)
{
int k=HashFunc(*p);
if(hash[k]==NULL)//如果数组中没有该元素,则不匹配
{
flag=false;
break;
}
p++;
}
if(flag)
cout<<"字符串匹配"<<endl;
else
cout<<"字符串不匹配"<<endl;
}
int main()
{
CHashTable HT=CHashTable();
char *strSrc;
char *strDest;
strSrc=new char[20];
strDest=new char[20];
cin>>strSrc;
cin>>strDest;
HT.CreateHash(strSrc);
HT.Show();
cout<<endl;
HT.SearchHash(strDest);
delete[] strSrc;
delete[] strDest;
}
来自:http://gengning938.blog.163.com/blog/static/128225381201151583552861/