您的位置:首页 > 其它

2009年北航:字符串的查找删除

2016-07-07 21:17 316 查看
题目描述:
给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。

输入:
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。

输出:
删除输入的短字符串(不区分大小写)并去掉空格,输出。

样例输入:
in
#include
int main()
{

printf(" Hi ");
}

样例输出:
#clude
tma()
{

prtf("Hi");
}

提示:
注:将字符串中的In、IN、iN、in删除。

#include <iostream>
#include <string.h>
using namespace std;
const int MAXN=1005;
char a[MAXN],b[MAXN];
int lena,lenb;
int nex[MAXN];
bool same(char ch1,char ch2)
{
if('A'<=ch1&&ch1<='Z')    ch1+=32;
if('A'<=ch2&&ch2<='Z')    ch2+=32;
return ch1==ch2;
}
void getnext()
{
int i=0;
int k=-1;
nex[0]=-1;
while(i<lenb)
{
if(k==-1||same(b[k],b[i]))
{
i++;
k++;
nex[i]=k;
}
else    k=nex[k];
}
}
int vis[MAXN];
void KMP()
{
int i=0;
int j=0;
while(i<lena)
{
if(j==-1||same(a[i],b[j]))
{
i++;
j++;
}
else    j=nex[j];
if(j==lenb)
{
int l=i-j;
for(int z=l;z<l+lenb;z++)
{
vis[z]=1;
}
j=0;
}
}
}
int main()
{
cin>>b;
lenb=strlen(b);
getnext();
cin.get();
while(cin.getline(a,MAXN))
{
lena=strlen(a);
memset(vis,0,sizeof(vis));
KMP();
for(int i=0;i<lena;i++)
{
if(a[i]==' '||vis[i])    continue;
cout<<a[i];
}
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: