串(string)是由零个或多个字符组成的有限序列,又名字符串。
字符串有很多函数,replace、ToUpper、ToLower(转小写)、Trim(去掉两边空格)、IndexOf(从左到右查找子串的位置)、SubString、SubLength等等。
一、串的存储结构
串的存储结构与线性表相同,分为顺序存储结构和链式存储结构。
1. 顺序存储结构
串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的。按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。
用“\0”来表示串的终结,不计入串长度,但是计入数组长度。
两个长度不同的串不可能相等。
2. 链式存储结构
要考虑一个结点是存放一个字符(会造成很大的空间浪费)还是多个字符。除了链接串与串的操作有一定方便外,总的来说不如顺序存储量或,性能也不如顺序存储结构好。
二、朴素的模式匹配算法
串的模式匹配:串的定位操作。
时间复杂度:O(1)–最好;O(n+m)–平均;O(n-m+1)*m–最不好
三、KMP模式匹配算法
KMP算法可以大大减少重复遍历的情况。
next数组(改进朴素匹配):后面一个与前面一个字符比较,若相等,k值是2,两个字符k值是3,n个k值相等就是n+1。第一个为0,其他不匹配的情况为1。
nextval数组(改进的KMP匹配):先计算next数组,逐个字符比较,若相等,nextval[j]=nextval[j],若不等,推倒重新比较,nextval[j]=next[i]。
三、题目
- n 个字符构成的字符串,假设每个字符都不一样,问有多少个子串?
n(n+1)/2 + 1 - 设模式串的长度为m,目标串的长度为n,当n≈m且处理只匹配一次的模式时,朴素的匹配(即子串定位函数)算法所花的时间代价可能会更为节省。