首先,什么是字符串,是一种编程语言中的一种数据类型,和int ,float,double都是相同,作为一种信息的表示形式,在c中用的是char型,而c++中用的是cstring,这点不讨论这两个的区别,仅仅就是作为一种比较。
好了,字符串是什么东西呢,字符串是有零个和多个字符串组成的有限"子集",这个地方的有限是什么个概念呢,比如现在有{0,1}这一个集合,很明显生成的字符串集将是以0和1元素构成的全部元素的集合,这个可以说成是一种闭包运算(自反可传递的闭包),很显然,这个集合是自然数的等势,也就是这个集合是无限可数集合,但是就集合中元素的长度,因为元素是由0,1所构成的,所以在形式上长度是有限的,这个可以说成是一种集合扩展的结果,元素不断的增加,但是元素本身不和集合之间有任何联系。
有了字符串就要考虑它的用途,在internet中的搜索引擎是不是要我们输入一些字符,这个就可以看出字符串的作用了,大量用于网页和数据库中,所以对其的匹配算法的研究一直是很热门的项目。现在就说说一些简单的匹配算法,比如像kmp和bf等等,这二个是本文章重点说明的内容,
bf(朴素算法)
从字面上讲,就是用一个小字符串找到主串中是否有相同的字符串,假设不相同的在模式串的最后,这可以将算法描述成
1、将s(主串)和t(模式)用数组的下标完成,也就是所谓的指针,对于为什么可以说成指针,这个是编译器的事情了,不在这点说明了。
2、如果s[i]=t[j],则是匹配的,将i和j下移至i+1和j+1,继续进行匹配,如同不同,则将i像前回溯,j向后回溯。
3、直到全部的主串匹配完成,否则,推出匹配算法。
kmp
仅仅是加入了一个next,这个next代表了模式串中的有几个和其相匹配的子串个数,这样就可以在时间复杂程度上(此仅仅为程序上的问题)可以缩小到n。当不匹配时就将模式串的指针回溯到当前所指向的next的位置,就可以继续查找。
代码就不在这点贴出来了,仅仅是完成一个思维上的洗礼。