串
串是由零个或多个字符组成的有限序列,又叫字符串。
串的定义
一般记为s=“a1aa2a3...an"(n>=0),其中s是串的名称,括起来的字符序列就是串的值。
串中的字符数目n称为串的长度,n是一个有限的数值。零个字符的串称为空串,可以直接用””表示。
空格串,是只包含空格的串。注意它和空串的区别,空格串是有内容有长度的,而且不止一个空格。
子串与主串,串中任意个数的连续字符组成的子序列称为改串的子串,相应地,包含主串的串称为主串。
子串在主串中的位置就是子串的第一个字符在主串中的序号。
串的比较
串的比较是通过串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号。
给定两个串:s="a1a2a3...an",t="b1b2...bm",当满足一下条件之一时,s<t。
(1)n<m,且ai=bi(i=1,2,...,n)。
(2)存在某个k<=min(m,n),使得ai=bi(i=1,2,...,k-1),ak<bk。
串的存储结构
串的顺序存储结构
串的顺序存储结构是用一组地址连续的存储串中的字符序列的。
一般串用‘\0'来表示串值的终结。
串的链式存储结构
串的链式存储结构,与线性表类似,但是串的结构中的每个元素是一个字符,如果也简单地应用链表存储串值,一个结点对应一个字符,会造成很大的空间浪费。因此可以一个结点存放多个字符,最后一个结点未被占满时,可以用其他非串值字符补全。
串的链式存储结构除了在连接串与串操作时有一定方便之外,总的来说不如顺序存储灵活,性能也不如顺序存储结构好。
朴素的模式匹配算法
子串的定位操作通常称为串的模式匹配。
/* 朴素的模式匹配法 */
int Index(String S, String T, int pos)
{
int i = pos; /* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */
int j = 1; /* j用于子串T中当前位置下标值 */
while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */
{
if (S[i] == T[j]) /* 两字母相等则继续 */
{
++i;
++j;
}
else /* 指针后退重新开始匹配 */
{
i = i-j+2; /* i退回到上次匹配首位的下一位 */
j = 1; /* j退回到子串T的首位 */
}
}
if (j > T[0])
return i-T[0];
else
return 0;
}
这种方法的时间复杂度为O(n+m);