串
一、串的定义
- 串(string)(或字符串)是由0个或多个字符组成的有限序列;0个字符的串称为空串(null string),其长度为0;
- 子串:主串中任意个连续的字符组成的子序列;子串的第一个字符在主串中的位置为子串的位置;
- 空格串(blank string):由一个或多个空格组成;
- 串是一种内容受限的线性表,其数据元素是单个字符。
二、串的存储结构
- 串的顺序存储结构
//-----串的定长顺序存储结构----- #define MAXLEN 255 //串的最大长度】 typedef struct { char ch[MAXLEN+1]; //存储串的一维数组 int length; //串的当前长度 }SString; //-----串的堆式存储结构----- typedef struct { char *ch; int length; }HString;
-
串的链式存储结构
//-----串的链式存储结构----- #define CHUNKSIZE 80 typedef struct Chunk { char ch[CHUNKSIZE]; struct Chunk *next; }Chunk; typedef struct { Chunk *head,*tail; //头尾指针 int length; }LString;
三、串的模式匹配算法
设有两个字符串S和T,S为主串,T为子串,也叫模式;
- BF算法
//-----BF算法----- int Index_BF(SString S,SString T,int pos) { int i = pos; //pos是主串中待匹配的起始地址 int j = 1; //j为子串中位置指针 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.lenth) return i-T.length; //成功 else { return 0; //失败 } }
最坏时间复杂度为O(m * n) , 最好时间复杂度为O(m + n) ;
-
KMP算法 参考于巨佬博客:https://www.cnblogs.com/ZuoAndFutureGirl/p/9028287.html
//-----KMP算法----- int Index_KMP(SString S,SString T,int pos) { int i = pos; int j = 1; //字符串从1开始 while(i<=S.length && j<=T.length) { if(j == 0 || S.ch[i]==T.ch[j]) { i++; j++; } else { j=next[j]; } } if(j>T.length) return i-T.length; else return 0; } void get_next(SString T,int next[]) { int i=1; next[1]=0; int j=0; while(i<T.length) { if(j==0 || T.ch[i]==T.ch[j]) { i++; j++; if(T.ch[i]!=T.ch[j]) next[i]=j; else next[i]=next[j]; } else j=next[j]; } }
时间复杂度为O(m + n) !
多维数组
- 多维数组可以看成是线性表的推广,其元素可以是具有某种结构的数据;
- 对于一些特殊矩阵(如对称矩阵、三角矩阵、对角矩阵),可通过对多个值相同的元只分配一个存储空间、对零元不分配空间来进行压缩存储。
广义表
- 定义:广义表是一种线性表的推广形式,表中的元素可以是称为原子的单个元素,也可以是一个子表;
- 广义表通常采用链式存储结构,包括:头尾链表的存储结构和扩展线性链表的存储结构。