字符串模式匹配——string

本文介绍了两种基本的字符串匹配算法:朴素的匹配模式和KMP匹配模式。朴素的匹配模式通过简单的逐字符比较实现匹配,而KMP算法则通过预处理模式串生成next数组来提高效率,避免不必要的比较。

1.朴素的匹配模式

int NaiveStrMatching(const string &T, const string & P)
{
	
	int pLen = P.length(), tLen = T.length();
	if (tLen < pLen)
		return -1;
	int t = 0, p = 0;	
	while (t < tLen && p < pLen)
	{
		if (T[t] == P[p])
		{
			t++;
			p++;			
		}
		else
		{
			t = t - p + 1;
			p = 0;
		}
	}
	if (p >= pLen)
		return (t - pLen );
	else
		return -1;
}

2.KMP匹配模式

int * Next(const string & P)
{
	int pLen = P.length();
	int * next = new int[pLen];
	next[0] = 0;
	for (int i = 1; i < pLen; i++)
	{
		int temp = next[i - 1];
		while (temp>0 && P[temp]!=P[i])
			temp = next[temp-1];
		if (P[temp] == P[i])
			next[i] = temp + 1;
		else
			next[i] = 0;
	}
	return next;
}

int KMPStrMatching(const string &T, const string &P,int * Next)
{
	int tLen = T.length(), pLen = P.length();
	if (tLen < pLen)
		return -1;
	int p = 0, t = 0;
	for (;p < pLen && t < tLen;t++)
	{
		while (p > 0 && P[p] != T[t])
			p = Next[p - 1];
		if (T[t] == P[p])
		{
			p++;
		}
		if (p == pLen)
			return (t - p + 1);
	}
	return -1;
}

 

### C语言字符串模式匹配算法实现 以下是两种常见的字符串模式匹配算法——BF(Brute Force)算法和KMP(Knuth-Morris-Pratt)算法的C语言实现。 #### BF算法实现 BF算法是最基础的字符串匹配方法,通过逐一比较主串与子串中的字符来完成匹配过程。如果当前字符不匹配,则移动到下一个可能的位置重新开始比较。 ```c #include <stdio.h> #include <string.h> // 定义简单字符串结构体 typedef struct { char val[100]; int length; } SString; // 暴力匹配算法 int force_search(SString S, SString T) { int i = 1, j = 1; // 初始化索引变量 while (i <= S.length && j <= T.length) { // 遍历主串和子串 if (S.val[i] == T.val[j]) { // 如果当前字符匹配 ++i; // 继续向后遍历 ++j; } else { // 否则重置指针 i = i - j + 2; // 主串回溯至下一位置 j = 1; // 子串回到起点 } } if (j > T.length) { // 若完全匹配返回起始位置 return i - T.length; } else { // 不匹配返回0 return 0; } } void main() { SString S, T; printf("请输入主串: "); scanf("%s", S.val); S.length = strlen(S.val); printf("请输入子串: "); scanf("%s", T.val); T.length = strlen(T.val); int pos = force_search(S, T); // 调用暴力匹配函数 if (pos != 0) { printf("子串在主串中的起始位置为:%d\n", pos); } else { printf("未找到匹配子串。\n"); } } ``` 此代码实现了简单的暴力匹配逻辑[^2]。 --- #### KMP算法实现 KMP算法的核心在于构建`next[]`数组,该数组记录了模式串的部分匹配信息,从而避免不必要的重复比较。这使得KMP的时间复杂度降低为线性级别 \( O(m+n) \)[^3]。 ```c #include <stdio.h> #include <string.h> // 计算 next 数组 void get_next(char *T, int *next) { int i = 0, k = -1; next[0] = -1; // 初始状态设置 while (i < strlen(T) - 1) { if (k == -1 || T[i] == T[k]) { ++i; ++k; next[i] = k; // 更新部分匹配值 } else { k = next[k]; // 回退寻找更长前缀 } } } // KMP 匹配算法 int kmp_search(char *S, char *T, int *next) { int i = 0, j = 0; while (i < strlen(S) && j < strlen(T)) { if (j == -1 || S[i] == T[j]) { ++i; ++j; } else { j = next[j]; // 使用 next 数组跳过不可能匹配的情况 } } if (j >= strlen(T)) { return i - strlen(T); // 返回匹配起始位置 } else { return -1; // 表示无匹配 } } void main() { char S[100], T[50]; int next[50]; printf("请输入主串: "); scanf("%s", S); printf("请输入子串: "); scanf("%s", T); get_next(T, next); // 构造 next 数组 int pos = kmp_search(S, T, next); // 执行 KMP 匹配 if (pos != -1) { printf("子串在主串中的起始位置为:%d\n", pos); } else { printf("未找到匹配子串。\n"); } } ``` 以上代码展示了如何使用`get_next()`函数计算`next[]`数组以及调用`kmp_search()`执行高效匹配[^3]。 --- ### 总结 上述两段代码分别演示了BF算法和KMP算法的具体实现方式。其中,BF算法虽然易于理解但效率较低;而KMP算法通过对模式串预处理优化了整体性能,在实际应用中更为推荐。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值