串
串
串的基本概念
- 串是特殊的线性表,存储的是字符
- 空串与空格串含义不同,空串长度为0,空格串是含有空格的串
- 子串是任意多个子序列组成的串,子串的位置就是其首个字符在串中的位置
- 串相等就是所有字符都一一对应相等
- 串一般使用顺序存储
- 表示串的长度一般用结束符,如’\0’
- C++ 字符串函数
- 求串长
- 串赋值
- 串连接
- 串比较
- 是否为子串
- 截取串
- 串插入
- 串删除
- 用子串替代另一个子串
- 输入字符序列
- 输出字符序列
- string.h(可以直接使用)
- 串长度 int strlen(char *str)
- 串拷贝 char *strcpy(char *str1,char *str2)
- 串连接 char *strcat(char *str1,char *str2)
- 串比较 char *strcmp(char *str1,char *str2)
- 串中字符定位char *strchr(char *str , char ch)
模式匹配算法
模式匹配定义:从一个主串中找查找一个字符串
Brute-Force算法
不动脑子的暴力算法,就是将主串和被查找串进行一一对比,如果不一样就主串查找的计数器要返回到最初的位置的后一位。这种算法是要返回主串计数器,计算次数较多,时间复杂度为O(n*m)
设主串计数器为i,被查找串计数器为j。当j>=被查找串长时找到被查找串。如果j<被查找串长且i>=主串长,则主串没有被查找串。
KMP算法
与BF算法不同的是KMP算法的主串计数器不会返回,它只会一路往前,这就使得它的复杂度变小,KMP算法的时间复杂度为O(n+m)。KMP需要计算失效函数来确定被查找串的回溯距离。
失效函数如下:
失效函数利用公共前后缀来得到被查找串回溯的距离,对于任何一个字符串,失效函数第一位一定是-1,第二位一定是0,失效函数看的是上一位的情况。
优化的失效函数
为什么要优化KMP算法?
优化的失效函数如下:
根据上述函数可知,优化的失效函数基于失效函数。在字符和以失效函数为下标的字符不等或者j=0时优化的失效函数和失效函数一致;当字符和以失效函数为下标的字符相等并且j≠0时,失效函数进行迭代,直至找到j=0或者字符与以失效函数下标字符不等的情况。
普通的失效函数比较的是之前串中前缀后缀的相同的数量,而优化的失效函数比较的是当前的字符。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 xljのblog!