1. 程式人生 > >【演算法分析】字串匹配:BF、KMP演算法

【演算法分析】字串匹配: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;
}

相關推薦

演算法分析字串匹配BFKMP演算法

字串匹配演算法:BF、KMP演算法程式碼。 /***************************************** Copyright (c) 2015 Jingshuang Hu @filename:demo.c @datetime:20

設計模式第一篇概述耦合UML七大原則,詳細分析總結(基於Java)

![](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/879cf035c7c044469f3589610c4ba7f8~tplv-k3u1fbpfcp-zoom-1.image) 迷茫了一週,一段時間重複的 CRUD ,著實讓我有點煩悶,最近打算將這些技術棧系列的文

學習筆記開發工具1Git的學習使用(簡單介紹)

一、Git的特點 1、較優的儲存能力; 2、比較好的效能; 3、開源的產品; 4、易備份; 5、支援離線操作; 6、定製工作流程。 二、Git的下載安裝配置 1、下載地址:https://git-scm.com/download/ 進入後選擇對應的作業系

開發工具壓力測試2Jmeter的安裝使用(TCP測試)

一、工具介紹         Apache JMeter是Apache組織開發的基於Java的壓力測試工具,用於對軟體做壓力測試,它最初被設計用於Web應用測試但後來擴充套件到其他測試領域。 它可以用於測試靜態和動態資源例如靜態檔案、Java小服務程式

讀書筆記JAVA基礎1深入理解JVM

  通過《深入理解JAVA虛擬機器》和《深入理解計算機系統》兩本經典著作的學習,注重瞭解系統程序執行時記憶體結構的變化,以此徹底瞭解JVM虛擬機器在執行JAVA程式時的記憶體結構!       主要有三個方面:   &nb

讀書筆記WEB應用1日誌配置

  log4j.properties 使用 一.引數意義說明 輸出級別的種類 ERROR、WARN、INFO、DEBUG ERROR 為嚴重錯誤 主要是程式的錯誤 WARN 為一般警告,比如session丟失 INFO 為一般要顯示的資訊,比如登入登出 DEBUG 為程式的除錯資訊

開發筆記支付專案1證書加解密簽名驗籤

最近做到了支付系統,由於對接第三方系統,涉及到證書籤名的問題,就抽時間瞭解了證書、私鑰、公鑰、簽名、驗籤等概念! 一、應用場景 首先需要了解HTTP和HTTPS        http就是網路的一種協議,伺服器與伺服器之間的資料互動,就用h

字串匹配MP,KMP,暴力搜尋等

看到一篇很好的部落格  轉一波~ MP/KMP 演算法詳解 By If Contents 目錄 4  MP 演算法 4.1  原理 9  PS 1  Prologue 本篇文章主要針對的是對字串匹配有興趣

資料結構與演算法-java實現二 複雜度分析(下)最好最壞平均均攤時間複雜度的概念

上一篇文章學習了:如何分析、統計演算法的執行效率和資源消耗? 點選連結檢視上一篇文章:複雜度分析上 今天的文章學習以下內容: 最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度 均攤時間複雜度 1、最好與最壞情況時間複雜度 我們首先

字串匹配演算法(三)位運算的魔法——KR與SO

位運算經常能做出一些不可思議的事情來,例如不用臨時變數要交換兩個數該怎麼做呢?一個沒接觸過這類問題的人打死他也想不出來。如果拿圍棋來做比喻,那麼位運算可以喻為程式設計中的“手筋”。 按位的儲存方式能提供最大的儲存空間利用率,而隨著空間被壓縮的同時,由於CPU硬體的直接支援,速度竟然神奇般

演算法分析排序演算法雞尾酒排序

        雞尾酒排序演算法是一種定向的冒泡法排序演算法,由於其來回折騰,又叫雞尾酒攪拌排序、來回排序、漣漪排序等。         演算法原理:陣列中的數字本是無規律的排放,先找到最小的數字,把他放到第一位,然後找到最大的數字放到最後一位。然後再找到第二小的數字放到第

資料結構與演算法模式匹配——從BF演算法KMP演算法(附完整原始碼)

模式匹配子串的定位操作通常稱為串的模式匹配。模式匹配的應用很常見,比如在文書處理軟體中經常用到的查詢功能。我們用如下函式來表示對字串位置的定位:int index(const string &T

演算法基礎字串的全排列演算法

題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入描述 輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。 這道題是劍指offfer中一道

資料分析Numpy基礎陣列和向量運算

☆Numpy(Numerical Python)是高效能科學計算和資料分析的基礎包,它是幾乎所有資料分析高階工具的構建基礎。 ndarry ,一個具有向量算數運算和複雜廣播能力的快速且節省空間的多維陣列。 用於對整組資料進行快速運算的標準數學函式(無需編寫迴

演算法分析Lucas–Kanade光流演算法

作者:[email protected]簡介:在計算機視覺中,Lucas–Kanade光流演算法是一種兩幀差分的光流估計演算法。它由Bruce D. Lucas 和 Takeo Kanade提出。光流的概念:(Optical flow or optic flow)它是一種運動模式,這種運動模式指的是

資料分析python金融資料指標分析

python:金融資料指標分析 # -*- coding: utf-8 -*- """ Created on Wed Jul 4 17:31:47 2018 @author: 孫正陽 """ #@匯入功能模組資料包 import numpy as np im

資料分析演算法+Echarts小練

''' 處理邏輯: 按number去處理 先遍歷所有的number挨個去找有沒有在列表裡的,在列表裡的拿出另外一個append 把number去除的列表 ''' li = [] with open(r'F:\資料分析專用\通話圈分析\new\test1.txt', 'r') as f:

演算法分析如何理解快慢指標?判斷linked list中是否有環找到環的起始節點位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 為例Python實現

快慢指標簡述 快慢指標經常用於連結串列(linked list)中環(Cycle)相關的問題。 快指標(fast pointer)和慢指標(slow pointer)都從連結串列的head出發。 slow pointer每次移動一格,而快指標每次移動兩格。 如果快慢指標能相遇,則證明連結串列中有環;否則沒有

字串匹配問題(BF演算法KMP演算法

問題: 給定兩個字串S和T,在主串S中查詢子串T的過程稱為串匹配,T稱為模式。 BF演算法(樸素模式匹配): BF演算法思想:         就是將目標串S的第一個字元與模式串T的第一個字元進行匹配,若相等,則繼續比較S的第二個字元和T的第二個字元;若不相等,則比較

無人零售易觀2017中國無人便利店發展專題分析

隨著智慧科技應用日趨成熟,零售業“無人化”概念在全球升溫,“無人化”技術逐漸步入廣泛商用階段。自2016年12月美國亞馬遜試水”Amazon Go”開始,無人便利店引起零售業界的廣泛關注,國內外市場中各種模式競相探索,無人便利店也將迅速發展。 作為移動網際網路大國,中國零售行業自然也在積極探索這一嶄新技術