串的定义
串(string)就是由零个或多个字符串组成的有限序列,又叫字符串。
串的比较
字符串的比较是通过组成字符串的字符之间的编码来进行的,编码即字符在对应字符集中的序号。
常用的有ASCLL编码、Unicode编码。
比较两个串的大小:先比较各字符大小然后比串长度。
串的储存结构
串同样有顺序储存结构和链式储存结构。
朴素的匹配模式
在文本串中查找模式串,朴素的匹配模式就是逐个遍历字符串,时间复杂度O(m*n)。
//在文本串S中查找模式串T
int strStr(String S, String T)//注意,c语言是没有String数据类型的
{
int i = 0;
int j = 0;
while(i < sLength && j < tLength)
{
if(S[i] == T[j])
{
++i;
++j;
}
else
{
i = i - j + 1;
j = 1;
}
}
if()
return i - tLength;
else
return 0;
}
KMP模式匹配算法
用于解决字符串匹配问题。在遇到不相同的字符时,通过使用前缀表(即最长相等前后缀)来回退到下一次遍历开始的位置,无需每次遍历均从头开始。
(前缀是包含首字母但是不包含尾字母的所有字串;后缀相反)
KMP算法可以将时间复杂度由O(n*m)降到O(n + m)。
KMP算法实现
通常使用next数组存放前缀表,next数组可以就是前缀表,但是很多实现都是把前缀表统一减一(或右移一位,初始位置为-1)之后作为next数组。实际上,其实这并不涉及到KMP的原理,而是其具体实现的不同。
计算next数组:(直接存放前缀表)