KMP算法 C#简单实现

KMP算法 C#简单实现

最近在学习数据结构,将KMP算法用C#简单实现了下。

static void Main(string[] args)

{

char[] source = {‘b‘,‘b‘,‘c‘,‘ ‘,‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘a‘,‘b‘,‘c‘,‘d‘,‘
‘,‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘d‘,‘e‘};

char[] target = {‘a‘,‘b‘,‘c‘,‘d‘,‘a‘,‘b‘,‘d‘};

int index = getStartIndex(source, target);

Console.WriteLine("匹配开始位置为:"+index);

}

static int getStartIndex(char[] s, char[] t)

{

int time = 0;//统计计算的次数

int[] next = initNext(t);

int i = 0, j = 0;

for ( i = 0; i < s.Length; )

{

for ( j = 0; j < t.Length;)

{

time++;

if (s[i] == t[j])

{

i++;

j++;

}

else

{

i = j>0?i - next[j-1]:i+1;

break;

}

}

if (j == t.Length)

return i-t.Length;

}

return -1;

}

static int[] initNext(char[] t)

{

int[] ret = new int[t.Length];

for(int i=0;i<t.Length;i++)

ret[i]=0;

for (int i = 1; i < t.Length; i++)

{

int temp = 0;

for (int j = 0; j < t.Length; j++)

{

while (t[i] == t[j] && i < t.Length && j < t.Length)

{

ret[i] = ++temp;

i++;

j++;

}

break;

}

}

return ret;

}

时间: 2024-10-09 23:21:06

KMP算法 C#简单实现的相关文章

KMP算法深度解析

[原文参考] http://www.ics.uci.edu/~eppstein/161/960227.html 摘要:KMP算法是字符串匹配的经典算法,由于其O(m+n)的时间复杂度,至今仍被广泛应用.大道至简,KMP算法非常简洁,然而,其内部却蕴含着玄妙的理论,以至许多人知其然而不知其所以然.本文旨在解开KMP算法的内部玄妙所在,希望能够有助于学习与理解. 1.KMP算法    一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此称之为KMP算

简单有效的kmp算法

以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(下不说程序实现,思想很简单). 模式匹配的经典应用:从一个字符串中找到模式字串的位置.如“abcdef”中“cde”出现在原串第三个位置.从基础看起 朴素的模式匹配算法 A:abcdefg  B:cde 首先B从A的第一位开始比较,B++==A++,如果全部成立,返回即可:如果不成立,跳出,从A的第二位开

运用kmp算法解决的一些问题的简单题解

学习kmp算法我最后是看的数据结构书上的一本教材学会的..我觉得kmp相对于普通的BF算法就是避免了很多不必要的匹配,而kmp算法的精髓自然就在于next数组的运用...而next数组简而言之就是存储的就是模式串中第j个字符与主串中相应字符"失配"时,在模式串中需要重新和主串中失配的字符相比较的位置...我觉得这句概括挺好的... 题1: hdu   1711  number   sequence 题目链接: http://acm.hdu.edu.cn/showproblem.php?

KMP 算法简单解释

KMP 算法简单解释 ? 讲KMP算法,离不开BF,实际上,KMP就是BF升级版,主要流程和BF一样,就是在削除回溯上花了点功夫,利用Next数组来削除 <( ̄︶ ̄)[GO!] 1. 先看看BF算法(暴力破解) int Brute_force_1(const char *S, const char *T) { if (!S || !T) return -1; int lenS = strlen(S); int lenT = strlen(T); int i = 0; //主串下标索引 int j

KMP算法简单回顾

前言 虽从事企业应用的设计与开发,闲暇之时,还是偶尔涉猎数学和算法的东西,本篇根据个人角度来写一点关于KMP串匹配的东西,一方面向伟人致敬,另一方面也是练练手,头脑风暴.我在自娱自乐,路过的朋友别太认真,嘿 背景 目标串: T(1…..n) 模式串: P(1…..m) 输出:搜索P在T中的位置 s,令 T(s…s+m-1) === P(1…m) 例如: a g c t a g c a g c t a g c t g中查找a g c t g 返回 12(从1计数) 资料 资料太多了,我在此不准备进

KMP算法实践与简单分析

一.理解next数组 1.约定next[0]=-1,同时可以假想在sub串的最前面有一个通配符"*",能够任意匹配.对应实际的代码t<0时的处理情况. 2.next[j]可以有如下的几种理解思路:1)next[j]为sub[j]前面的字符串的前后缀字符串匹配的最大匹配长度例如sub="ababap"next[5]=3,前后追匹配字符串为"aba"2)在sub[j]位置匹配失败后,next[j]为为sub串的位置指针j能够先前回溯到的位置.3

Linux GCC下strstr的实现以及一个简单的Kmp算法的接口

今天做了一道题,要用判断一个字符串是否是另一个字符串的子串,于是查了一下strstr的实现. 代码如下: 1 char *strstr(const char*s1,const char*s2) 2 { 3 const char*p=s1; 4 const size_t len=strlen(s2); 5 for(;(p=strchr(p,*s2))!=0;p++) 6 { 7 if(strncmp(p,s2,len)==0) 8 return (char*)p; 9 } 10 return(0)

KMP算法 - 字符串匹配的简单运用 --- HDU 1711

Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11606    Accepted Submission(s): 5294 Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b

hiho 1015 KMP算法 &amp;&amp; CF 625 B. War of the Corporations

#1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一只河蟹,于是河蟹就向小Hi和小Ho提出了那个经典的问题:“小Hi和小Ho,你们能不能够判断一段文字(原串)里面是不是存在那么一些……特殊……的文字(模式串)?” 小Hi和小Ho仔细思考了一下,觉得只能想到很简单的做法,但是又觉得既然河蟹先生这么说了,就