定义
串是字符串的简称,是一种限定数据元素为字符的线性表。所以可以定义为串是一个有穷字符序列。区别
串作为一种特殊的线性表,它和一般的线性表的差别主要是在操作上。线性表的操作对象都是线性表中的单个数据元素,或查找或插入或删除。而串的这些操作的对象可以是单个数据元素也可以是连续的多个元素组成的子串。这里看下图:存储结构
既然做为一种特殊的线性表,也就是说它本质上还是一个线性表。因此在存储上和一般的线性表的思路是一致的,有顺序和链式。一般情况下用数组来实现串的顺序存储。这里需要注意的是,关于串的长度有两种表示方式,一种是设置一个长度参数,一种是在串的末尾加入结束标志'\0'。那么,链式存储结构中一个节点可以存储一个或多个字符。串的节点的大小直接影响串的操作效率。这一点有区别中串的操作可以知道,因为串的操作对象是子串。而节点过大的话就是说节点中的多个字符只有其中一个字符的物理地址是可以直接查询到的。如图“克”这个字串匹配起来就比较麻烦:
模式匹配
这里也要先了解个概念:模式串,即目标字符串的子串。模式匹配也就是在主字符串中定位模式串的过程。有两种算法朴素匹配和KMP匹配。朴素匹配算法:从主串的第一个字符起与模式串的第一字符比较,若相等,则继续对后续字符进行比较。其中有一个字符不匹配就从主串的第二字符与模式串的第一个字符重新执行这一匹配过程。如图所示:
从图中描述的匹配过程可以看到,当模式串较长且匹配到最后一个字符才不相等时就需要对主串的指针进行回溯。即从指向E变成指向B。当模式串很长时将影响效率。因此有人对朴素匹配进行优化而得到了新的算法,即KMP算法。
KMP匹配算法:每当匹配过程中出现字符不相等时,不需要回溯主串的执政位置,而是利用已经得到的部分匹配结果,将模式串向右滑动尽可能远的距离再继续比较。看图例:
总结:串的是一种特别的线性表,其特别之处在于它操作的对象是一个子串而不是单个字符。也就导致了其在存储(链式)和匹配时比较特殊。