文章目录
一 串的定义和实现
1 定义
串是由零个或多个字符组成的有限序列,可以是字母,数字或者其他字符
由一个或多个空格组成的串称为空格串(空格也是一种符号)
如“hello world 232@#%^&”
2 串的存储结构
2.1 定长顺序存储表示
#define maxline 255
typedef struct
{
char ch[maxline];
int length;
}Sstring;
一组连续的存储单元
超过的长度会发生截断;一般字符串的结尾都有一个隐含的“\0”,不计入长度
2.2 堆分配存储表示
仍是一组连续的存储单元,但是存储空间是执行过程中动态分配的
typedef struct
{
char *ch;
int length;
}Hstring;
2.3 块链存储表示
每个结点可以存放一个字符,也可以存放多个字符
每个结点称为块,整个链表称为块链结构
最后一个结点占不满时通常用#补上
3 串的基本操作
Strassign(&T,chars); \\T赋值到chars
Strcopy(&T,S); \\S复制到T
Strempty(S); \\判空
Strcompare(S,T); \\比较ST,S>T返回值大于0
Strlength(S); \\求串长
Substring(&Sub,S,pos,len); \\用sub返回s从pos位置长度为len的子串
Concat(&T,S1,S2); \\T返回s1和s2的串接
Index(S,T); \\若S中存在T相同的子串,返回第一次出现的位置,否则为0
Clearstring(&S); \\清空
Destroystring(&S); \\销毁
二 串的模式匹配
1 简单的模式匹配算法
模式匹配:子串的定位操作,求的是子串在主串中的位置
采用定长顺序存储结构
暴力算法:
int Index(Sstring S,Sstring R)
{
int i =1,j=1;
while(i<=S.length && j<= T.length)
{
if(S.ch[i]==T.ch[j])
{
i++;
j++;
}
else
{
i=i-j+2; \\比对失败倒退下标
j=1;
}
}
if(j >T.length)
return i-T.length; \\找到了位置并返回
else
return 0; \\没找到
}
时间复杂段:O(mn),m,n分别是子串和主串的长度
算法思想:主串和子串的字符一一对比,如果不对,子串倒退到一开始,主串倒退到刚刚比较的的下一个位置
当子串为“00001”,主串为“0000000000000000000000001”时,可以预想到查找效率极低,需要匹配到最后一个位置才能找到
2 串的模式匹配算法——KMP算法
从刚刚的例子可以看出第四次和第五次是不需要进行的