题目描述
给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
输入
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
输出
删除输入的短字符串(不区分大小写)并去掉空格,输出。
样例输入 Copy
in #include int main() { printf(" Hi "); }
样例输出 Copy
#clude tma() { prtf("Hi"); }
提示
注:将字符串中的In、IN、iN、in删除。
思路: 先判断需要处理的字符串与子字符串的长度,若子字符串长,则原字符串不需要处理;
否则,依次比较待处理字符串的字符str[i]是否与子字符串的第一个字符sub[0](不区分大小写)相同,不同则i++,否则进行下面的比较:判断str[j] == sub[i]是否成立,若成立则i,j各自加1,否则退回。(该过程有点类似于朴素模式匹配算法)。
代码如下:(字符数组一定要进行初始化,否则会出现运行错误)
#include<bits/stdc++.h>
using namespace std;
void cmpare(char str[1000],char sub[1000],char result[1000]){
if(strlen(str) < strlen(sub)) strcpy(result,str);
else{
char c = sub[0];
if(sub[0] >='a' && sub[0] <= 'z'){
c -= 32;
}else c += 32;
int i = 0;
int index = 0; // 保存结果的下标
while(str[i] != '\0'){
if(str[i] != sub[0] && str[i] != c && str[i] != ' '){
result[index++] = str[i];
i++;
}
else{
int begin = i; // 开始求子串的坐标
int end = i + strlen(sub); // 子串的最长长度
for(int j = begin; j < end; j++){
c = sub[j - begin];
if(sub[j-begin] >='a' && sub[j-begin] <= 'z'){
c -= 32;
}else c += 32;
if(str[j] != sub[j - begin] && str[j] != c){
i = begin;
result[index++] = str[i++];
// printf("result = %s\n",result);
break;
}else{
i++;
}
}
}
// puts(result);
}
result[index] = '\0';
}
}
int main(){
char sub[10000] = "",str[10000] = "";
scanf("%s",sub);
getchar();
while(gets(str) != NULL){
char result[10000] = "";
cmpare(str,sub,result);
for(int i = 0; i < strlen(result); i++){
if(result[i] != ' ') printf("%c",result[i]);
}
printf("\n");
}
}