字符串匹配:BF、KMP算法

字符串匹配算法:BF、KMP算法代码。

/*****************************************
Copyright (c) 2015 Jingshuang Hu  

@filename:demo.c
@datetime:2015.10.11
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
/**************************************************/
int text_read(char *S);
void BF_String_Matching(char *S, char *T);
void KMP_String_Matching(char *S, char *T);
int *Partial_Matching_Table(char *T);
/**************************************************/
int main()
{
	char *S = (char *)malloc(1000 * sizeof(char));
	char T[100];
	text_read(S);
	printf("给定文本串:\n%s", S);
	printf("\n输入模式串:\n");
	gets(T);
	printf("\n-------BF算法-------\n");
	BF_String_Matching(S, T);
	printf("\n-------KMP算法------\n");
	KMP_String_Matching(S, T);
	printf("\n\n");
	return 0;
}
/**************************************************/
int text_read(char *S)
{
	int len = 0;
	char ch;
	FILE *fp = fopen("test.txt","r");
	if (!fp)
	{
		printf("打开文件失败!\n");
		return 1;
	}
	while((ch = getc(fp)) != EOF)
	{
		S[len] = ch;
		len++;
	}
	fclose(fp);
	S[len] = '\0';
	S = (char *)realloc(S, (len + 1) * sizeof(char));
	return 0;
}
/**************************************************/
//暴力法
void BF_String_Matching(char *S, char *T)
{
	int S_length = strlen(S);
	int T_length = strlen(T);
	int i = 0, j = 0, same_length = 0;
	for (i = 0; i < S_length - T_length; i++)
	{
		for (j = 0; j < T_length; j++)
		{
			if (S[i + j] == T[j])
			{
				same_length++;
			}
			else
			{
				break;
			}
		}
		if (same_length == T_length)
		{
			printf("在位置%d发现匹配!\n", i + 1);
		}
		same_length = 0;
	}
}
/**************************************************/
//KMP   移动位数 = 已匹配的字符数 - 对应的部分匹配值
void KMP_String_Matching(char *S, char *T)
{
	int *table = Partial_Matching_Table(T);//获取部分匹配表
	int S_length = strlen(S);
	int T_length = strlen(T);
	int i = 0, j = 0;
	int same_length = 0, move_pos = 0;
	for (i = 0; i < S_length - T_length; i++)
	{
		if (S[i + 0] != T[0])//第一个字符都不等,则后移一位
		{
			continue;
		}
		else//否则,继续对比后面字符
		{
			same_length++;
			for (j = 1; j < T_length; j++)
			{
				if (S[i + j] == T[j])
				{
					same_length++;//已匹配数
				}
				else
				{
					move_pos = table[j - 1];
					break;
				}
			}
		}
		if (same_length == T_length)
		{
			printf("在位置%d发现匹配!\n", i + 1);
			i += T_length - 1;//直接往后移动T_length位
		}
		else
		{
			i += same_length - move_pos - 1;//移动后i的位置
		}
		same_length = 0;
	}
}
/**************************************************/
//部分匹配表
int *Partial_Matching_Table(char *T)
{
	int T_length = strlen(T);
	int *table = (int *)malloc(T_length * sizeof(int));
	int k = -1, i = 0, j = 0;
	memset(table, 0, T_length);//全部初始化成0
	table[0] = -1;
	while(j < T_length)
	{
		if ((-1 == k) || (T[k] == T[j]))
		{
			j++;
			k++;
			table[j] = k;
		}
		else
		{
			k = table[k];
		}
	}
	for (i = 0; i < T_length; i++)
	{
		table[i] = table[i + 1];
	}
	table = (int *)realloc(table, T_length * sizeof(int));
	return table;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 15:37:23

字符串匹配:BF、KMP算法的相关文章

字符串匹配的KMP算法

html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; line-height: 1.6; color: ; background-color: ; margin: 0; padding: 16px 20px; } h1, h2, h

[算法系列之二十六]字符串匹配之KMP算法

一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的. 二 基于部分匹配表的KMP算法 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含搜索串"ABCDABD"? 步骤1:字符串"BBC ABC

字符串匹配(KMP 算法 含代码)

主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知识 串(string或字符串)是由零个或多个字符组成的有限序列,一般记为 当中s是串的名,用单引號括起来的字符序列是串的值:ai(1<=i<=n)能够是字母.数值或其它字符.串中字符的数组 n称为串的长度.零个字符的串称为空串,它的长度为0 串中随意个连续的字符组成的子序列称为该串的子串. 包括子

字符串匹配与KMP算法笔记

>>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个一个进行比较, 如果不成功则模式串向右移动一个单位,直到匹配成功或者到达匹配串最后仍然不成功,返回失败. 很明显,这种算法有很多的地方可以优化,假设要搜索的串为S,长度为n,要匹配的串为M,长度为m,时间复杂度为O(nm). >>KMP算法 Knuth-Morris-Pratt算法以三个发明者命名

字符串匹配的KMP算法(转)

字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth. 这种算法不太容易理解,网上有很多解释,但读起来都很费劲.直到读到Jake Boxer的文章,我才真正理解这种算法.下面,我用自己的语言

字符串匹配的KMP算法(转载)

字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth. 这种算法不太容易理解,网上有很多解释,但读起来都很费劲.直到读到Jake Boxer的文章,我才真正理解这种算法.下面,我用自己的语言

[转] 字符串匹配的KMP算法

字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth. 这种算法不太容易理解,网上有很多解释,但读起来都很费劲.直到读到Jake Boxer的文章,我才真正理解这种算法.下面,我用自己的语言

字符串匹配之KMP算法

1.前言: leetcode上的28. Implement strStr()就是一个字符串匹配问题.字符串匹配是计算机的基本任务之一.所以接下来的两篇日志,都对相关的算法进行总结. 2.暴力求解算法 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有: 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符: 如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0.相当于每次匹配失败时,i 回溯

字符串匹配暴力算法 与 字符串匹配的KMP算法

声明:先看一下阮一峰的网络日志关于字符串的KMP算法的讲解.本文图片均引用于这篇日志. 在先前的笔试中遇到了关于字符串匹配的问题,一时脑袋卡壳没写好算法.现在就来分析分析 暴力算法和KMP算法各自原理,以及代码实现,之间差异,并且总结一下好算法的一般思路. =========================================================================== 各自原理: 暴力算法: 1. 我们把长的字符串做为一个文本字符串,命名为strText,把

字符串匹配的KMP算法(转)

转载:http://kb.cnblogs.com/page/176818/ 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth. 这种算法不太容易理解,网上有很多解释,但读起来都很费劲.直