问题 C: 字符串的查找删除
时间限制: 1 Sec 内存限制: 32 MB
题目描述
给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
输入
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
输出
删除输入的短字符串(不区分大小写)并去掉空格,输出。
样例输入
in
#include
int main()
{
printf(" Hi ");
}
样例输出
#clude
tma()
{
prtf(“Hi”);
}
提示
注:将字符串中的In、IN、iN、in删除。
思路:设置两个数组,一个做统一化处理,一个保持原样,关键字也是统一化处理,循环读入字符,当遇到和关键字末尾一致的字符,指针向前移动len-1个长度,遍历这len个元素是否和关键字一致,若一致,将字符数组指针向前移动len-1个单位,重新输入,覆盖掉(等于删掉)
之后再判断是否为空格,进行输出
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000000
int main()
{
char a[maxn],ans[maxn];
char del[10000];
gets(del);
int len = strlen(del);
for(int i=0; i<len;i++)
{
if(del[i]>='A' && del[i] <= 'Z') del[i] += 32; //全部转为小写
}
int k=0;
while(scanf("%c",&a[k]) !=EOF)
{
ans[k] = a[k];
if(a[k]>='A' && a[k] <= 'Z') a[k] += 32; //全部转为小写
if(a[k] == del[len-1]) //末尾一位相等,往回退
{
int i,t=0;
for(i = k-len+1; i<=k;i++) //往前退len-1个长度
{
if(a[i] != del[t++] ) break; //有不一样的就没找到子串,目标子串从0开始
}
if(i == k+1) k = k-len+1; //指针指回去
else k++;
}
else k++; //继续读
}
for(int i=0;i<k;i++)
{
if(ans[i] !=' ') printf("%c",ans[i]);
}
//printf("\n");
return 0;
}
(参考https://blog.csdn.net/xunalove/article/details/87886017)