1. 字符串
串是由零个或多个字符组成的有限序列。
串的基本运算:
StrAssign(cstr):由字符串常量cstr创建一个串,即生成其值等于cstr的串。
StrCopy():串复制,返回由当前串复制产生一个串。
getsize():求串长,返回当前串中字符个数。
geti(i):返回序号i的字符。
seti(i, x):设置序号i的字符为x。
Concat(t):串连接,返回一个当前串和串t连接后的结果。
SubStr(i, j):求子串,返回当前串中从第i个字符开始的j个连续字符组成的子串。
InsStr(i, t):串插入,返回串t插入到当前串的第i个位置后的子串。
DelStr(i, j):串删除,返回当前串中删去从第i个字符开始的j个字符后的结果。
RepStr(i, j, t):串替换,返回用串t替换当前串中第i个字符开始的j个字符后的结果。
DispStr():输出字符串。
串的模式匹配——KMP算法:
KMP算法:解决从一个主串中快速找出一个子串的问题,消除了目标串指针的回溯,使算法效率提升。主串叫目标串,子串叫模式串
研究模式串就可以找出其与任意主串匹配的部分匹配值。
每个位置的部分匹配值存储在next数组中
next[0]默认为-1,next[j]的值就等于j位置前面字符串中最大公共前后缀的长度
next数组的用法:当模式串的j位置与主串的i位置不匹配时,令模式串的next[j]位置与主串的i位置继续匹配。
推荐视频: 【天勤考研】KMP算法易懂版_哔哩哔哩_bilibili
原理如下图:
例题如下图(通过模式串写出对应的next[j]):
练习的例题:
例一:
例二:
2. 数组
数组通常采用顺序存储的方式来实现。
一维数组:
一维数组的所有元素依逻辑次序存放在一片连续的内存存储单元中。
一维数组的存储:其起始地址为第一个元素a0的地址即LOC(a0)。假设每个数据元素占用k个存储单元。则任一数据元素ai的存储地址LOC(ai)就可由公式求出:
多维数组:
- 数组(主要是二维)在以行序和列序优先的存储中的地址计算方法
- 特殊(对称、三角、对角)矩阵在压缩存储时的下标变换公式
多维数组(主要是二维)在以行序和列序优先的存储中的地址计算方法
注意行列是从0还是1开始
(1) 按行优先(row major order)存储
假设每个元素占k个存储单元,LOC(a0,0)表示a0,0元素的存储地址。对于元素ai,j:
- ai,j前面有0~i-1共i行,每行n个元素,共有i×n个元素。
- 在第i行中前面有a[i,0..j-1],共j个元素。
- 合起来,ai,j前面有i×n+j(整行数×每行元素个数 + 本行中aij前面的元素个数)个元素。
(2) 按列优先(column major order)存储
假设每个元素占k个存储单元,LOC(a0,0)表示a0,0元素的存储地址。对于元素ai,j:
- ai,j前面有0~j-1共j列,每列m个元素,共有j×m个元素。
- 在第j列中前面有a[0..i-1,j],共i个元素。
- 合起来,ai,j前面有j×m+i个元素。则: