一种类似和谐系统的字符串匹配算法

实现一个挺高级的字符匹配算法:
给一串很长字符串,要求找到符合要求的字符串,例如目的串: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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值