以下所有为个人学习笔记(王道考研-数据结构 )
定义(逻辑结构)
补:数据结构三要素--逻辑结构、数据的运算、存储结构(物理结构)【存储结构不同,运算的实现方式不同】
子串的位置是第一个字符在主串中的位置
基本操作(运算)
存储结构
顺序存储
//静态数组实现(定长顺序存储)
#define MAXLEN 255 //预定义最大串长为255
typedef struct{
char ch[MAXLEN]; //每个分量存储一个字符
int length; //串的实际长度
}SString;
//动态数组实现(堆分配存储)
typedef struct{
char *ch; //按串长分配存储区,ch指向串的基地址
int length; //串的长度
}HString;
HString S;
S.ch=(char *)malloc(MAXLEN *sizeof(char)); //用完需要手动free
S.length=0;
方案2的缺点:ch[0]只能表示0-255
方案3的缺点:要想知道length只能遍历
链式存储
typedef struct StringNode{
char ch;
struct StringNode *next;
}StringNode, *String;
typedef struct StringNode{
char ch[4]; //每个结点存多个字符
struct StringNode *next;
}StringNode, *String;
基于顺序存储实现基本操作
字符串模式匹配
主串
子串--主串的一部分,一定存在
模式串--不一定能在主串中找到
字符串模式匹配:在主串中找到与模式串相同的子串,并返回其所在位置。
朴素模式匹配算法
将主串(长度为n)中所有长度为m的子串【最多对比n-m+1 个子串】依次与模式串(长度为m)对比,直到找到一个完全匹配的子串,或所有的子串都不匹配为止。
i=i-j+2;
j=1;
大懒虫一个别管了
暴力解决
KMP算法
改进思路:主串指针不回溯,只有模式串指针回溯
右下角为由模式串确定的next数组
优先考虑上下能够匹配长度更长的情况
特别地,next[1]=0,i++,j++
38没看,回头不会了当复习课看
求next数组
next[1]无脑0,next[2]无脑1
最后那个40真的真的不行了 明天补