codeup 字符串的查找删除(C++)

题目描述

给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。

输入

输入只有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
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");
	}
} 

 

你可能感兴趣的:(codeup)