删除子串算法。C语言


不完全用指针实现,如果有更好的方法,请告知。

int find_all_pattern_substr(char *str,char const *substr)
{
	int count = 0;
	const char * tempstr = substr;
	while (*substr != '\0')
	{
		char *ch2 = str;

		for (; *ch2 != '\0'; *str++)
		{
			if (*substr == *ch2)
			{
				count++;
				*substr++;
			}
			*ch2++;
			
		}
		*substr++;
	}

	if (count < strlen(tempstr))
	{
		return -1;
	}

	return 1;

}

int delete_substr(char *str, char const *substr)
{
	char *str2 = str;
	char const *substr2 = substr;
	string finalchar = str;
	int i=0,begin=0;

	if (find_all_pattern_substr(str2, substr2) == 1)
	{
		while (begin==0&&*str != '\0')
		{

			char const *substr3 = substr;
			for (; *substr3 != '\0';)
			{
				if (*str == *substr3)
				{
					/*strcpy_s(str, strlen(str),"");*/

					begin = i;
					break;
					
				}
				*substr3++;
			}
			*str++;
			i++;
		}
	string s = finalchar.replace(begin, strlen(substr), "");
	cout << s.c_str();
		return 1;
	}
	return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{
	//cout << find_char("ABCDEF", "GDK") << endl;

	delete_substr("ABCDEFGH", "EFG");


	system("pause");
	return 0;
}



结果:


在C语言中,简单子串搜索通常是指线性查找法,也称为逐字符比较法。这种算法的基本思想是,在主字符串中从头开始逐个字符地与目标子串进行比较,如果找到完全匹配的部分,则认为找到了子串;如果没有找到,则继续向后移动主字符串的指针,直到遍历完整个主字符串。 以下是简单的C语言实现: ```c #include <stdio.h> #include <string.h> // 函数声明 int searchSubString(char str[], char subStr[], int n); int main() { char mainStr[] = "Hello, World!"; char subStr[] = "World"; int result = searchSubString(mainStr, subStr, strlen(subStr)); if (result != -1) { printf("Substring found at position %d\n", result); } else { printf("Substring not found.\n"); } return 0; } // 子串搜索函数 int searchSubString(char str[], char subStr[], int n) { int i, j; // 主字符串长度 int lenMain = strlen(str); // 子字符串长度 int lenSub = strlen(subStr); for (i = 0; i <= lenMain - lenSub; i++) { j = 0; while(j < lenSub && str[i+j] == subStr[j]) { j++; } if (j == lenSub) { return i; // 找到子串,返回起始位置 } } return -1; // 如果找不到子串,返回-1 } ``` 在这个例子中,`searchSubString`函数会返回目标子串在主字符串中的起始索引,如果未找到则返回-1。请注意,这种方法的时间复杂度为O(n*m),其中n为主字符串长度,m为子字符串长度,因为最坏情况下需要检查整个主字符串的每个位置。对于大型数据集,更高效的算法如KMP算法、Boyer-Moore算法等会更适合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值