串
来源:互联网 发布:uc聊天软件下载 编辑:程序博客网 时间:2024/04/30 09:58
串(String) 是由零个或者多个字符组成的有限序列,又名字符串。
一般记为s="a1a2......an"(n>=0),其中s是串的名称,用双引号引起来的是串的值,i是该字在串中的位置。
串中字符数目n称为串的长度。零个字符串称为空串(null string),其长度为0,可以直接使用双引号“”标识。
所谓的序列,说明串的相邻字符之间有着前驱和后继的关系。
空格串,只包含空格的串。他与空串的区别是,空格串有内容有长度,而且其可以不止一个空格。
子串和主串,串中任意个数的连续字符串组成的子串序列称为该串的子串,包含子串的串称之为主串。
串的比较
串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在相应字符集中的序号。( 不单单是AscII,还有其他的如Unicode, GB2312等)。
silly > stupid, 是因为第二个位置的i > t,使得silly > stupid。 有时也会发现有些序列会出现这样的排序,1,10,11,2,20,22...这种遍是通过串比较进行排序。
实际上,传递比较是通过组成串的字符之间的编码来进行,而字符的编码指的是字符在字符集中的序号。 (ASCII 128(256)个字符, Unicode 65万)
在C中对于串的比较,如果两串相等,需要他们的长度,以及他们对应位置的字符都相等,才是两串相等。
对于两串不等,如何判定其大小?
给定两个串:s="a1a2......an", t="b1b2......bm",当满足如下条件之一时,s<t.
1, n<m, 并且ai=bi( i = 1,2......n).
2,存在某个k<=min(n,m), 使得ai= bi(i = 1,2.....,k-1), ak<bk
串的存储结构
串的存储结构与线性表相同,分为顺序和链式两种;
串的顺序存储结构
顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列。按照预定的大小,为每个定义的串变量分配一个固定长度的存储区。一般用定长数组来定义。
有的是用‘\0’来作为串的结尾;
串的链式存储结构
链式存储结构与线性表的相似,但是由于串结构的特殊性,结构中的每个元素为一个字符。但是如果简单的应用链表存储串值,一个结点放一个字符,便会使得存储空间有很大的浪费。因此可以通过一个结点放多个字符,若最后一个结点未满时,可以通过“#”,或者其他字符补全。
朴素的模式匹配算法
即,主串的每个字符作为其子串的开头,与要匹配的字符串进行匹配。对主串做大循环,每个字符开头做要匹配串长度的小循环,直到匹配成功或全部遍历结束为止。
假设,主串S和要匹配子串T的长度都存在S[0] 和 T[0]中;
// 返回子串T在主串S中第pos个字符之后的位置。如果不存在,则函数返回0// T非空, 1<=pos<=StrLength(S)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退回上次匹配首位的下一位,S中 其中加2的原因是pos不为1 j = 1; // j退回到子串T的首位 } } if(j > T[0]) return i-T[0]; else return 0;}