串的应用很广泛
案例:病毒感染检测(字符串序列——环装)


串的类型定义、存储结构及其运算

数据对象,数据关系,
基本操作:
        StrAssign(&T, chars)
        StrCompare(S, T)
        StrLength(S)

        图片说明

        ★ Index(S, T, pos)

逻辑结构(线性)、存储结构(顺序串、链串)

串的顺序存储结构
#indefine MAXLEN 255
typedef struct{
    char ch[MAXLEN + 1];
    int length;
}SString;

串的链式存储结构
(多个字符放在一个结点,会提高存储密度 —— 块链)

在实际当中,顺序存储结构用的更多。(实际当中插入删除很少,匹配查找用顺序存储结构更加方便)


串的操作
(串的模式匹配算法)
目的:确定子串第一次出现的位置(定位)(没有就返回0)
应用:搜索引擎、拼写检查、语言翻译、数据压缩

BF(Brute-Force, 暴力破解
KMP算法(特点:速度快)

BF
简单匹配法
正文串、模式
算法的思路是从S的每一个字符开始依次与T的字符进行匹配。

目标串、模式串
n=6, m=4

i = 1, j = 1;
匹配失败就:
i = i - j + 2; (目标串向前移动一下)
j = 1;(模式串从头开始)

匹配成功
返回:i - t.length

算法设计思想
    将主串的第pos个字符和模式串的第一个字符比较,
        若相等,继续逐个比较后续字符;
        若不等,从主串的下一字符起,重新与模式串的第一个字符比较。
            
            直到主串的一个连续子串字符序列与模式串相等。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。
            否则,匹配失败,返回值0

从第一个位置开始查:i = 1
int Index_BF(SString S, SString T) {
    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(n*m)


KMP算法:(由三个科学家名字命名的)
        利用已经部分匹配的结果而加快模式串的滑动速度
        且主串S的指针i不必回溯,可以提速到O(n+m