字符串匹配算法

大学狗,期末复习数据结构到模式匹配这一块,顺便就把书上的几个算法详细地写了一遍。

下面这个程序中包含三个字符串匹配的方法,分别是:常规的从左往右匹配法,先首尾后中间匹配法,以及经典的KMP算法。

前两种算法适用于下标从0开始的字符串,KMP算法适用于下标从1开始的字符串。KMP算法处理下标从0开始的字符串,next函数使用的时候会出现问题,

所以只能从下标1开始(所以我测试的字符串的首位是用1占位),如果有大神知到怎样改到可以从零开始,求赐教!!!

编译环境为vs2013

// ConsoleApplication5.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "string.h"
#include "stdlib.h"

//按顺序依次对比,适用于字符串下标从0开始
int IndexOrd(char* S,char* T,int pos)
{
	int s = strlen(S);;
	int t = strlen(T);
	for (int i = pos;i<s-t;i++)
	{
		int temp = i;
		for (int j = 0; j <t; j++)
		{
			if (S[temp] == T[j])
			{
				printf("%c ",S[temp]);
				temp++;
			}
			else
			{
				break;
			}
		}
		if (temp - i  == t)
			return i;

	}
	return 0;
}


//先比较首尾,后比较中间,适用于字符串下标从0开始

int Index_Fl(char* S,char* T,int pos)
{
	int s = strlen(S);
	int t = strlen(T);
	int start, end;
	for (int i = pos; i < s - t;)
	{
		start = i;
		end = start + t - 1;
		if (S[start] != T[0])
		{
			i++;
		}
		else if (S[end]!=T[t-1])
		{
			i++;
		}
		else
		{
			int temp = i+1;
			int k = 1;
			while (temp<i+t-1)
			{
				if (S[temp] = T[k])
				{
					temp++;
					k++;
				}
				else
					break;
			}
			if (temp - i  == t)
			{
				return i;
			}
			else
				i++;
			
		}
	}



	return 0;
}


//KMP算法,适用于字符串下标从1开始
//判断是否相等
bool isEqual(char*S, int pos, int num)
{

	for (int i = 1; i <=num; i++)
	{
		if (S[i] != S[pos - num + i-1])
			return false;

	}
	return true;
}

int* getArray(char* S)
{
	int* next;
	int s = strlen(S);
	next = (int*)malloc((s)*sizeof(int));
	next[0] = s;
	for (int j = 1; j < s; j++)
	{
		if (j == 1)
		{
			next[j] = 0;
		}
		else
		{
			int k = 1;
			int max = 1;
			while (k+1<j)
			{
				if (isEqual(S, j, k))
				{
					max = k + 1;
				}
				k++;
			}
			next[j] = max;

		}


	}


	return next;

}


int KMPsearch(char* S,char* T,int pos,int* next)
{
	int i = pos;
	int j = 1;
	int s = strlen(S);
	int t = strlen(T);
	int w = 0;
	for (;j<t&&i<s;)
	{
		
		if (S[i] == T[j])
		{
			i++; j++;
		}
		else
		{
			printf("\nj=%d,next[%d]=%d",j,j,next[j]);
			j = next[j];
			
			if (j == 0)
			{
				i++;
				j = 1;
			}
		}

	}
	if (j == t)
		return i+1-t;
	else
		return -1;

}



int _tmain(int argc, _TCHAR* argv[])
{
	char a[] = "abcdef";
	char b[] = "e";
	int m = Index_Fl(a,b,0);
	printf("结果是:%d\n",m);


	int* s;
	char S[] = "1acabaabaabcacaabc";
	s = getArray("1abaabcac");
	for (int i = 0; i < 9; i++)
	{
		
		printf("%d ",s[i]);
	}

	int n = KMPsearch(S, "1abaabcac",1,s);
	printf("结果是:%d\n", n);
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有关病毒方面课程的实验内容 实验一 PE结构分析及DOS病毒感染与清除 一、实验目的 1.熟悉PE文件结构 2.掌握DOS系统下.EXE文件病毒感染与清除方法 二、实验要求 1.实验之前认真准备,编写好源程序。 2.实验中认真调试程序,对运行结果进行分析,注意程序的正确性和健壮性的验证。 3.不断积累程序的调试方法。 三、实验内容 1)手工或编程从user32.dll中获得MessageBoxA的函数地址; 2)查阅资料,结合第2章内容,根据PE结构编写一个小的工具软件,或者用PE Explorer、PEditor、Stud_PE等工具软件查看、分析PE文件格式。针对PE文件格式,请思考:Win32病毒感染PE文件,须对该文件作哪些修改; 3)示例病毒exe_v感染原理及其清除 实验二 Windows病毒分析与防治 一、实验目的 掌握Windows病毒感染与清除方法 二、实验要求 1.实验之前认真准备,编写好源程序。 2.实验中认真调试程序,对运行结果进行分析,注意程序的正确性和健壮性的验证。 3.不断积累程序的调试方法。 三、实验内容 1)编程实现Immunity病毒; 2)修复被Immunity感染的host_pe.exe 3)编程实现脚本病毒或宏病毒,参考相关章节爱虫/梅丽莎病毒;修复被上述病毒感染的系统 实验三 蠕虫/木马的分析与防治 一、实验目的 掌握蠕虫/木马感染与清除方法 二、实验要求 1.实验之前认真准备,编写好源程序。 2.实验中认真调试程序,对运行结果进行分析,注意程序的正确性和健壮性的验证。 3.不断积累程序的调试方法。 三、实验内容 1)实现“冲击着清除者”病毒; 2)实现远程线程动态嵌入技术的木马并验证; 3)实现木马远程监视/控制; 4)修复被上述病毒感染的系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值