来源:互联网 发布: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;}


KMP模式匹配算法(未完)


原创粉丝点击