间隙字符串匹配问题(c++)
<P>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P><P>[**** Hidden Message *****</P>#include <iostream>
#include <fstream>
using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");
class String
{
public:
String(char *s="");
String(const String& s);
~String();
int Length() const;
int ReadString();
int Rs();
void Prefix();
void ModifiedPrefix();
int Match(int i,String& t);
private:
char *str;
int *pre;
int size;
};
String::String(char *s)
{
size=strlen(s)+1;
str=new char;
if(str==0)
throw "error";
strcpy(str,s);
pre=new int;
if(pre==0)
throw "error";
}
String::String(const String& s)
{
size=s.size;
str=new char ;
if(str==0)
throw "error";
strcpy(str,s.str);
pre=new int ;
if(pre==0)
throw "error";
}
String::~String()
{
delete [] str;
delete [] pre;
}
int String::Length() const
{
return size-1;
}
int String::ReadString()
{
char tmp;
if(in>>tmp)
{
delete [] str;
size=strlen(tmp)+1;
str=new char ;
strcpy(str,tmp);
return size-1;
}
else
return -1;
}
int String::Rs()
{
char tmp,c;
int i=0;
while(in>>c)
{
if(c!='*')
tmp=c;
else if(c=='*'&&i>0)
break;
}
if(i>0)
{
delete [] str;
size=i+1;
str=new char;
if(str==0)
throw "error";
for(i=0;i<size-1;i++)
str=tmp;
return size-1;
}
else
return -1;
}
void String::Prefix()
{
int m=Length();
delete [] pre;
pre=new int ;
pre=0;
int k=0;
for(int i=2;i<=m;i++)
{
while((*(str+i-1)!=*(str+k))&&(k>0))
k=pre;
if(*(str+i-1)==*(str+k))
pre=++k;
else
pre=0;
}
}
void String::ModifiedPrefix()
{
int *f;
int m=Length();
f=new int;
Prefix();
for(int i=1;i<=m;i++)
{
f=pre;
}
for(i=1;i<m;i++)
{
int k=f;
if((k==0)||(*(str+i)!=*(str+k)))
pre=k;
else
pre=pre;
}
delete []f;
}
int String::Match(int i,String& t)
{
int j=0;
int n=Length(),m=t.Length();
t.ModifiedPrefix();
while((i<=n)&&(j<m))
if(str==t.str)
{
i++;
j++;
}
else
if(j==0)
i++;
else
j=t.pre;
if(j<m)
return 0;
else
return i-1;
}
int main()
{
if(in.fail())
{
cout<<"the input.txt is not exist!";
exit(1);}
int i=1;
String s,t;
s.ReadString();
while(t.Rs()+1)
{
i=s.Match(i,t);
if(!i)
{
out<<"No"<<endl;
break;
}
}
if(i)
out<<"Yes"<<endl;
return 0;
} 看看啊 顶 谢谢 <p>谢啦~~</p> 好吧 看看看看看看看看
页:
[1]