1. 串(String)是由零个或多个字符组成的有限序列。
2. 零个字符的串成为空串,它的长度为零。
3. 串中任意个连续的字符组成的子序列成为该串的子串。
4. 包含子串的串相应地成为主串。
5. 称两个串是相等的,当且仅当这两个串的值相等。(两个穿的长度相等,并且各个对应位置的字符都相等)
6. 由一个或多个空串组成的串‘’成为空格串。注意:此处不是空串,它的长度为串中空格字符的个数。
7. 空串:长度为0,不含任何字符的串。
8. 空串是任意串的子串,任意串是其自身的子串。
9. 对串的操作:
串赋值(StrAssign)
串比较(StrCompare)
int StrCompare(HString S, HString T) {
for (i=0; i<S.length && i<T.length; ++i)
if (S.ch[i]!=T.ch[i]) return S.ch[i]-T.ch[i];
return S.length-T.length;
}// StrCompare
求串长(StrLength)
串联结(Contact)
Status Concat(SString &T, SString S1, SString S2) {
if (S1[0]+S2[0] <= MAXSTRLEN) { // 未截断
T[1...S1[0]] = S1[1...S1[0]];
T[S1[0]+1...S1[0]+S2[0]] = S2[1...S2[0]];
T[0] = S1[0]+S2[0]; uncut = TRUE;
}else if (S1[0] < MAXSTRSIZE) { // 截断
T[1...S1[0]] = S1[1...S1[0]];
T[S1[0]+1...MAXSTRLEN] = S2[1...MAXSTRLEN-S1[0]];
T[0] = MAXSTRLEN; uncut = FALSE;
} else { // 截断(仅取S1)
T[0...MAXSTRLEN] = S1[0...MAXSTRLEN];
uncut = FALSE;
}
return uncut;
} // Concat
求子串(SubString)
Status SubString(SString &Sub, SString S, int pos, int len) {
if (pos < 1 || pos > S[0] || len < 0 || len > S[0]-pos+1)
return ERROR;
Sub[1…len] = S[pos…pos+len-1];
Sub[0]=len;
return OK;
} // SubString
串赋值
Status Strcopy(HString &T, HString S) {
if (T.ch) free(T.ch);
n=S.length;
if (n!=0) {
T.ch=(char *)malloc(n*sizeof(char)));
T.ch[0..n-1]=S.ch[0..n-1];
T. length=S.length;
}
return OK;
} Strcopy
1. s =‘ a1 a2 a3 … ai …an ’ ( n≥0 )。 注意:必须有‘’
2. x = ‘123’ x = 123 作用:避免字符串与变量名或数的常量混淆。
- “串值大小” 是按 “词典次序”
4. 进行比较的,如:
StrCompare(“data”, “stru”)<0
StrCompare(“cat”, “case”)>0
5. 串是特殊的线性表,故其存储结构与线性表的存储结构类似,只不过组成串的结点是单个字符。
6. 定长顺序存储表示,也称为静态存储分配的顺序串, 即用一组地址连续的存储单元依次存放串中的字符序列。
7. “定长”、“静态”的意思可简单地理解为一个确定的存储空间,它的长度是不变的。
8. 堆分配存储表示堆存储结构的特点:仍以一组空间足够大的、地址连续的存储单元依次存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配的。
9. 堆存储结构的优点:堆存储结构既有顺序存储结构的特点,处理(随机取子串)方便,操作中对串长又没有任何限制,更显灵活,因此在串处理的应用程序中常被采用。
10. 串的块链存储表示:串值也可用单链表存储,简称为链串。 链串与单链表的差异只是它的结点数据域为单个字符。
优点:便于插入和删除 缺点:空间利用率低
20. 为了提高空间利用率,可使每个结点存放多个字符 (这是顺序串和链串的综合 (折衷) ),称为块链结构。
21. 串的模式匹配算法:就是在主串中找出子串出现的位置。
1. 从主串 S 的第 pos 个字符起和模式 T 的第一个字符比较之,若相同,则继续比较后续字符;否则从主串 S 的下一个字符起再重新和模式 T 的字符比较之。
2. 时间复杂度:效率高时为O(m+n) 某些特殊的情况下,效率比较低,此时为O(m*n)
m和n分别为主串和子串的长度。
3. KMP算法
25. 当主串中第 i 个字符与模式串中第 j 个字符不等时,仅需将模式串向右滑动至第k个字符和主串中第i个字符比较即可。
26. KMP 算 法
int Index_KMP(SString S, SString T, int pos) {
i = pos; j = 1;
while (i <= S[0] && j <= T[0]) {
if (j = = 0 || S[i] = = T[j])
{ ++i; ++j; } // 继续比较后继字符
else j = next[j]; // 模式串向右移动
}
if (j > T[0]) return i-T[0]; // 匹配成功
else return 0;
}