串
概述
刚开始的计算机都是数值工作,后来引入了免费 Java Update 8的概念,计算机开始可以处理非数值概念了。(原理还是通过数值来模拟非数值,通过ASCII码表)。
一个具有注脚的文本。
🎨ASCII码表:
串的数据结构
- 定义:串(String)是由零个或者多个字符组成的有限序列,又称为“字符串”
- 记法:
s = "a1a2a3a4......an"
(N>=0) - 提示:串可以为空,由
" "
来表示
💡子串与主串:
例如字符串"Hello World"
,"Hello"
就是它的一个子串
💡字符串的比较:
字符串大小的比较方法:从一个字符起,比较两个字母ASCII值的大小。如果相等则比较下一位,以此类推。
⭐️字符串的存储结构:
- 存储结构与线性表相同,也分为顺序存储结构和链式存储结构
- 字符串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的
- 按照预定义的大小,为每个定义的字符串变量分配一个固定存储长度的存储区,一般用定长数组来定义。
- 固定长度的存储区会存在控件分配不灵活的缺点,这时候就会考虑使用链式存储结构。
不同的是,字符串我们一般都是连在一起表述的,所以习惯上我们还是直接定义一个足够长度的存储区来存储字符串
模式匹配算法
🔔S是主串,T是子串,对于子串的定位操作通常称为串的模式匹配
⚠️有的教材上使用S[0]、T[0]来存储串的长度。这里弃用。
1、简单算法
现有两个字符串S和T,长度为m和n。首先S[0]和T[0]进行比较,若相等,继续比较,只要遇到不等的情况,将T[0]和S[1]继续比较;如果相同,继续比较直到比较结束。再次遇到不同的情况,将T[0]与S[2]继续比较,以此类推。
💡该算法最坏情况下要进行M*(N-M+1)
次比较,时间复杂度为O(M*N)
参考代码:
#include <stdio.h>
#include <string.h>
/**
* 串-BF算法1
* @return
*/
int BruceForce(char s[], char t[], int pos) {
int len = strlen(s);
int len2 = strlen(t);
int i = pos, k = 0;
int count = 0;
while (i < len && k < len2) {
if (s[i] == t[k]) {
//继续向后比较字符
i++;
k++;
} else {
i = i - k + 1; //i先回退到第二格
k = 0;
}
}
if (k >= len2)
return (i - len2); //返回子串首次出现的下标
else return -1;
}
int main() {
char s[100] =