zoukankan      html  css  js  c++  java
  • KMP和BF算法-C语言实现

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <malloc.h>
    //以下为KMP算法
    void get_next(char * T, int next[])   //修正前的next数组
    {
    	int i = 1, j = 0;
    	next[0] = -1;
    	next[1] = 0;
    	int m = strlen(T);
    	while (i<strlen(T) - 1)
    	{
    		if (j == -1 || T[j] == T[i])
    		{
    			++i;
    			++j;
    			next[i] = j;
    		}
    		else j = next[j];
    	}
    }
    void get_nextval(char * T, int nextval[]) //修正后的nextval数组
    {
    	int i = 1, j = 0;
    	nextval[0] = -1;
    	nextval[1] = 0;
    	int m = strlen(T);
    	while (i<strlen(T) - 1)
    	{
    		if (j == -1 || T[j] == T[i])
    		{
    			++i;
    			++j;
    			if (T[i] != T[j]) nextval[i] = j;
    			else nextval[i] = nextval[j];
    		}
    		else j = nextval[j];
    	}
    }
    int Index_KMP(char * S, char * T, int pos, int next[])   //逐项比较
    {
    	int j = 0, i = pos, lens = strlen(S), lent = strlen(T);
    	get_next(T, next);
    	while (i < lens && j < lent)
    	{
    		if (S[i] == T[j] || j == -1)
    		{
    			i++; j++;
    		}
    		else j = next[j];
    	}
    	if (j >= lent) return i - lent;
    	else return -1;
    }
    
    //以下为BF算法
    int Pos_BF(char * S, char * T)
    {
    	int pos = 1;
    	for (int i = 0; i < strlen(S); i++)
    	{
    		if (S[i] == T[0])
    			return pos;
    		else
    			pos++;
    	}
    	return 0;
    }
    int Index_BF(char * S, char * T)
    {
    	int i = 0, j = 0;
    	int lens = strlen(S), lent = strlen(T);
    	while (i <= lens -1  && j <= lent -1 )
    	{
    		if (S[i] == T[j])
    		{
    			++i;
    			++j;
    		}
    		else
    		{
    			i = i - j + 1;
    			j = 0;
    		}
    	}
    	//跳出循环有两种可能,i=lens说明已经遍历完主串,匹配失败;j=lent,说明子串遍历完成,在主串中成功匹配
    	if (j == lent) {
    		return i - lent + 1;
    	}
    	//运行到此,为i==lens的情况
    	return -1;
    }
    
    
    int main()
    {
    	//char *S = "adbadabbaabadabbadada", *T = "adabbadada";
    	char S[30];
    	char T[20];
    	printf("请输入两个字符串进行匹配:
    ");
    	printf("请输入母串:");
    	scanf("%s", S);
    	printf("请输入匹配串:");
    	scanf("%s", T);
    	//此处开始测试KMP算法
    	printf("
    **********************KMP算法**************************
    ");
    	int m;
    	int *next = (int *)malloc((strlen(T) + 1)*sizeof(int));   //修正前的next数组
    	int *nextval = (int *)malloc((strlen(T) + 1)*sizeof(int));    //修正后的nextval数组
    	get_next(T, next);
    	printf("修正前next数组为:");
    	for (m = 0; m<strlen(T); m++)
    	{
    		printf("%d ", next[m] + 1);
    	}
    	get_nextval(T, nextval);
    	printf("
    修正后的nextval数组为:");
    	for (m = 0; m<strlen(T); m++)
    	{
    		printf("%d ", nextval[m] + 1);
    	}
    	int t1 = Index_KMP(S, T, 0, nextval);
    	if (t1 == -1) printf("
    无匹配项!
    ");
    	else
    	{
    		printf("
    在第%d项开始匹配成功
    ", t1 + 1);
    	}
    	//此处开始测试BF算法
    	printf("
    **********************BF算法**************************
    ");
    	int t2 = Index_BF(S, T);
    	printf("
    在第%d项开始匹配成功
    ", t2);
    	system("pause");
    	return 0;
    }
    

    实验结果

  • 相关阅读:
    java读取配置文件 xml properties的几种方法
    aix source 命令
    解决连接ORACLE错误一例:ORA01033: ORACLE 正在初始化或关闭
    oracle database character set
    spring junit 测试
    Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php
    Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer
    Atitit.木马病毒 webftp 的原理跟个设计
    Atitit.js this错误指向window的解决方案
    Atitit.反编译apk android源码以及防止反编译apk
  • 原文地址:https://www.cnblogs.com/zhengyu-ahu/p/12038827.html
Copyright © 2011-2022 走看看