百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

数据结构之 串 的详解(数据结构中串的概念)

ztj100 2025-07-15 02:16 1 浏览 0 评论

定义

内容受限的线性表

串(string):零个或者多个任意字符组成的有限序列
字串:串中任意个连续字符组成的字序列
主串:包含子串的串相应地 字符位置:字符在序列中序号为该字符在串中的位置
字串位置:字串第一个字符在主串中的位置 空格串:由一个或多个空格组成的串,与空串不同
串相等:当且仅当两个串的长度相等并且各个对应位置上字符相同时,这两个串才是相等的

数学表示

S=“a1a2……an”(n>=0)

注: - S为串名 - a1a2……an为串值 - n为串长

抽象类型定义

ADT String {
数据对象: D={ ai | ai∈ CharacterSet,记为 V,i=1 ,2 ,…, n,n≥ 0 }
结构关系: R={< ai,ai + 1 >| ai,ai + 1 ∈ V,i=1 ,…, n-1 ; n-1 ≥ 0 }
基本操作:
StrAssign(&T,chars)//串赋值
操作前提: chars 是字符串常量。
操作结果:生成一个值等于 chars 的串 T。

StrInsert( S,pos,T)//字串插入
操作前提:串 S 存在,1 ≤ pos≤ StrLength( S)+ 1 。
操作结果:在串 S 的第 pos 个字符之前插入串 T。

StrDelete( S,pos,len)
操作前提:串 S 存在,1 ≤ pos≤ StrLength( S)+ 1 。
操作结果:从串 S 中删除第 pos 个字符起长度为 len 的子串。

StrCopy( S,T)
操作前提:串 S 存在。
操作结果:由串 T 复制得串 S。

StrEmpty( S)
操作前提:串 S 存在。
操作结果:若串 S 为空串,则返回 TRUE,否则返回 FALSE。

StrCompare(S,T) //串比较
操作前提:串 S 和 T 存在。
操作结果:若 S>T,则返回值>0 ;如 S=T,则返回值=0 ;若 S<T,则返回值<0 。

StrLength(S)
操作前提:串 S 存在。
操作结果:返回串 S 的长度,即串 S 中的字符个数。

StrClear( S)
操作前提:串 S 存在。
操作结果:将 S 清为空串。

ConCat(&T,S1,S2)
操作前提:串 S1 、S2 和 T 存在。
操作结果:将串 S1 和 S2 的值连接在串 T 的后面。

SubString( Sub,S,pos)
操作前提:串 S 存在,1 ≤ pos≤ StrLength( S)且 1 ≤ len≤ StrLength( S)- pos+1
操作结果:用 Sub 返回串 S 的第 pos 个字符起的子串。

StrIndex( S,pos,T)
操作前提:串 S 和 T 存在,T 是非空串,1 ≤ pos≤ StrLength( S)。
操作结果:若串 S 中存在和串 T 相同的子串,则返回它在串 S 中第 pos 个字符 之后第一次出现的位置;否则返回 0 。

StrReplace( S,T,V)
操作前提:串 S、 T 和 V 存在且 T 是非空串。
操作结果:用 V 替换串 S 中出现的所有与 T 相等的不重叠的子串。

StrDestroy( S)
操作前提:串 S 存在。
操作结果:销毁串 S。
}ADT string

顺序存储结构

#define MAXSIZE 255
typedef struct{
char ch[MAXSIZE+1];//存储串的一维数组
int Length;//串的当前长度
}SString

链式存储结构

#define CHUNKSIZE 80 //块的大小可由用户定义
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct{
Chunk *head, *tail;//串的头指针和尾指针
int curlen;//串的当前长度
}LString;//字符串的块链结构

模式匹配算法

  • 算法的目的: 确定主串中所含字串第一次出现的位置
  • 算法的应用:搜索引擎、拼写错误、语言翻译、数据压缩
  • 算法种类:BF算法KMP算法(速度快)

1.BF算法

Brute-Force简称BF算法,亦称为简单匹配算法,采用穷举法的思路

算法思路:从S的每一个字符开始依次与T的字符进行匹配

实现:
Index(S,T,pos) - 将主串的第pos个字符和模式串(字串)的第一个字符比较
- 若相等,继续逐个比较后续字符 - 若不等,从主串的下一个字符起,重新与模式串的第一个字符比较 - 直到主串的一个连续字串字符序列与模式串相等。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功 - 否则,匹配失败,返回值为0

int Index_BF(SString S,SString T,int pos ){
int i = pos;
int j = 1;//字符的序号从1开始
while(i<=S.length && j<=T.length){
if(s.ch[i]==t.ch[j]){
++i;
++j;//主串和字串依次匹配下一个字符
}
else{
i = i - j + 2;//主串则向前移动一个字符
j = 1;//字串返回到第一个字符
}
}
//这里j>T.lngth是因为字串T的最后一个字符和主串的字符还是一样,那么进入while循环后又++j,所以只要j.length大于T的字符长度则说明全部字符都匹配成功
if(j>T.length) return i-T.length;//返回匹配的第一个字符的下标
else return 0;//模式匹配不成功

}

2.KMP算法

KMP算法是D.E.Knuth、J.H.Morris和V.R.Pratt共同提出,简称KMP算法
该算法较BF算法有较大的改进,从而使算法效率有了某种程度的提高

算法思想:利用已经部分匹配的结果而加快模式串的滑动速度,而主串S的指针i不必回溯,可提速到O(n+m)

主串和模式串不断比较,如果在比较失败,主串的i不用回溯到比较字符中第一个字符的第二个字符,而只用模式串j进行回溯,与主串再次进行下一轮比较,在这个过程中,我们用next[j]存储需要回溯到重新比较的值

image.png

代码实现

int Index KMP (SString S,SString T, int pos) {
i= pos,j =1;
while(i<S.length && j<T.length) {
if (j==0 S.chi]==T.ch[j]) {
i++;j++;
}
else{
j=next[j];//i不变,j后退
}

}
if (j>T.length) return i-T.length; //匹配成功
else return 0;//返回不匹配的标志

void get_next(SString T, int &next[]){
int i= 1;
next[1] = 0;
int j = 0;
while( i<T.length){
if(j==0||T.ch[i] == T.ch[j]){
++i; ++j;
next[i] = j;
}
else{
j = next[j];
}
}
}

相关推荐

Win10预览版10532已知问题汇总(微软win11正式版已知问题一览)

IT之家讯微软已向Insider用户推送了Win10预览版10532更新,本次更新对右键菜单、《Windows反馈》应用以及Edge浏览器进行了改进。除此之外还包含一些Bug,汇总如下,有意升级Wi...

Gabe Aul正测试Win10 Mobile 10532,Insider用户还需等

IT之家讯本月中旬微软向Insider用户推送了Win10Mobile预览版10512,该版本修复了一些Bug,增强了系统稳定性,但依然存在一些问题。今天,微软Insider项目负责人GabeAu...

微软开始推送Win10预览版10532快速版更新

8月28日消息,刚才,微软推送了Win10Build10532快速版,修复了之前的Bug,并带来了三项改进。主要来说,这次的更新改进了右键菜单的UI,使其更具Modern风格(见上图)。此外,更新...

Win10预览版10532更新内容大全(windows10更新预览版)

IT之家讯今天凌晨微软向Insider用户推送了Win10预览版10532快速版更新,本次更新主要带来了三处改进,汇总如下:o改进右键菜单,外观更加Modern。这是基于网友要求界面一致的反馈做出...

无法升级Win10预览版10532?也许Hyper-V在搞鬼

根据IT之家网友的反映,安装了微软虚拟机Hyper-V的Win10预览版用户无法成功升级Build10532版本,安装过程中会被要求回滚系统。很多朋友在尝试关闭虚拟机之后重启安装程序,结果仍然无法顺...

Win10预览版10532界面兴起“酷黑”风潮

Win10预览版10532的界面改动还是较为明显的,主要体现在右键菜单上面。总体来看,该版本的右键菜单间距更宽,视觉上更大气,操作上更便于触控。具体来说,任务栏右键菜单的变化最为明显。除了增加选项的宽...

Win10预览版10532上手图集(windows10预览版下载)

IT之家讯8月28日,微软今天推送了Win10预览版10532快速版更新,在该版本中,微软主要是加强细节上调整,并且主要是增强Edge浏览器性能等。在Windows10预览版10532中,微软改进了...

Win10预览版10532上手视频亮点演示

IT之家讯8月28日消息,今天凌晨微软向WindowsInsider快速通道用户推送了Win10预览版10532。在Windows10预览版10532中,微软改进了右键菜单,外观更加现代化。另外还...

第二篇 前端框架Vue.js(vue前端框架技术)

前端三大核心是网页开发的基础,Vue则是基于它们构建的“生产力工具”。通俗理解就是HTML是化妆的工具如眉笔,CSS是化妆品如口红,JavaScript是化妆后的互动,而Vue就是化妆助手。有了化妆工...

基于SpringBoot + vue2实现的旅游推荐管理系统

项目描述...

基于Vue以及iView组件的后端管理UI模板——iview-admin

介绍iView-admin是一套后端管理界面模板,基于Vue2.0,iView(现在为ViewUI)组件是一套完整的基于Vue的高质量组件库,虽然Github上有一套非常火的基于ElementUI...

别再说你会SPA开发了,这5个核心你真的搞懂了吗?

前言此spa非彼spa,不是你所熟知的spa。你所熟知的spa作者肯定是没有你熟悉的。我们这里指的是在前端开发中的一种模型,叫作单页应用程序,顾名思义,就是整个项目只有一个页面,而页面中的内容是动态的...

React.js Top20面试题(react.js中文官网)

概述作为React开发者,对框架的关键概念和原则有扎实的理解是很重要的。考虑到这一点,我整理了一份包含20个重要问题的清单,每个React开发者都应该知道,无论他们是在面试工作还是只是想提高技能。...

美媒:特朗普签署行政令后,FBI又发现约2400份、总计超14000页涉肯尼迪遇刺案文件

来源:环球时报新媒体1月23日特朗普下令公布肯尼迪遇刺案相关机密文件图源:美媒综合福克斯新闻网和Axios网站10日报道,在总统特朗普签署行政令,要求公布“肯尼迪遇刺案”相关政府机密文件之后,美国...

2021 年 Node.js 开发人员学习路线图

Node.js自发布以来,已成为业界重要破局者之一。Uber、Medium、PayPal和沃尔玛等大型企业,纷纷将技术栈转向Node.js。Node.js支持开发功能强大的应用,例如实时追踪...

取消回复欢迎 发表评论: