目录

基本概念

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

串的顺序存储结构

串的链式存储结构

串的模式匹配算法

BF算法(简单匹配算法)

KMP算法


基本概念

 串:零个或多个任意字符组成的有限序列

串长:注意需要计算空格长度

子串:串中任意个连续字符组成的子序列(含空串)

真子串:不包含自身的所有子串

主串:包含子串的串

字符位置:字符在序列中的序号

子串位置:子串第一个字符在主串中的位置

空格串:由一个或多个空格组成的串

不同于空串

串相等:iff两个串的长度相等并且各个对应位置上的字符都相同时

所有空串都是相等的。(长度均为,字符均为空)

单引号本身不属于串

在串的基本操作中,通常以串的整体作为操作对象,而线性表的基本操作中,大多以单个元素作为操作对象。

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

串的顺序存储结构

一组地址连续的存储单元存储串值的字符序列

串的实际长度可以再预定义长度的范围内随意,超过预定义长度的串值被舍去

串长的2种表示方法:

1.以下标为0的数组分量存放串的实际长度,S[0]就存放了实际长度

2.在串值后面加入一个不计入串长的结束标记字符,如C中以'\0'表示串值的终结,但这样串长为隐含值。

#define MAXSTRLEN 255//预定义在255内定义最大串长
typedef unsigned char SString[MAXSTRLEN +1];//0号单元存放串长
#define MAXLEN 255
typedef struct
{char ch[MAXLEN+1];//存储串的一维数组int length;//串的当前长度
}SString;

256个空位,下标为[0]到[255],但是下标为[0]的空位不用,从下标为[1]开始存放字符数据。

类型必须为字符型。

串的链式存储结构

 优点:操作方便;缺点:存储密度低

存储密度=串值所占空间/实际分配的存储(=1/5 只有一个字符时)(地址占4个,一个字符占1个)

注:地址所占字节问题:

变量所占字节由它的类型决定,如果是复杂类型如结构体所占内存必须大于等于它的所有成员所占内存之和。(为什么可能大于,那是因为有内存对齐问题)
而变量的地址所占的内存大小是确定的,一般它是一个32位的长整型,也就是说它占4个字节。

所以常用改进后的形式(下侧)。

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

串用顺序存储结构更方便,下面都是基于顺序存储结构进行操作

串的模式匹配算法

BF算法(简单匹配算法)

穷举法思想

注意有用下标从[1]开始

回溯:i=i-j+2的理解:

(j-1)表示i,j移动了多少;i-(j-1)=i-j+1表示i退回到原来位置;i-j+2表示i到原来位置的下一个位置。

返回:i-t.length 的理解:

i当前在s串后一位,t.length是t串长,返回对比前的位置

总体思路

int Index BF(SString S, SString T)
{int i=1,j=1;while(i<=S.length && j<=T.length)//j>T.length则T中字符都被匹配成功{if(S.ch[i]==T.ch[j]){i++;j++;//继续比较后继字符;}else{i=i-j+2;j=1;//指针后退重新开始匹配;}}if(j>T.length)return i-T.length;elsereturn 0;
}

时间复杂度:

回溯指针是BF时间复杂度高主要原因

KMP算法

改进思路:每当一趟匹配过程中出现字符比较不等时,不需要回溯 i指针,而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。

时间复杂度提高到O(m+n)。

关键在于求主串中第i个字符(i指针不回溯)与模式中哪个字符再比较 :

大致思路 next[j]:第j个字符匹配不上,则在模式串中第1到第(j-1)个位置上的字符从两头开始比对,长度逐渐延长,找到能够匹配上的字符的长度(两端的最大匹配)(注意:这里只是从两端取字符串,匹配顺序都是各自串从左到右),在j不等于1且能够匹配成功的条件下,假设最大匹配长度为k-1(注意:1.两端找的字符串不能够是自身 2.不是遇到匹配不了就停止,可能左3与右3匹配不上,而左4与右4能够匹配,结束条件是匹配长度=j-1),则j回到第k个位置即可(前k-1个字符都能够匹配成功),即next[j]=k;若j=1,则next[j]=0;若j不等于1但是找不到匹配成功的情况,则next[j]=1。

注意:j回到下表为next[j]的位置;滑动的字符为 j-next[j] 个

int Index_KMP(SString S, SString T, int pos)//pos为主串中起始位置
{int i=pos,j=1;//从主串中第i个位置往后查找匹配while(i<=S[0] && j<=T[j])//这里字符数组的下表为0的位置存放字符长度//注意循环条件{if(j==0 || S[i]==T[j]){i++; j++;}else{j=next[j];}}if(j>T[0])    return i-T[0];//匹配成功,返回匹配成功的第一个字符位置else    return 0;
}

next函数求解:

next函数的改进

Data Structure CH4 串相关推荐

  1. CF data structure 自制题单(一)

    CF data structure 2000~2100 为你的战斗,献上雷鸣般的喝彩!--唔姆 目标 30 道题 1. Problem - 1555E - Codeforces 看了提示 给一些线段, ...

  2. LeetCode Two Sum III - Data structure design

    原题链接在这里:https://leetcode.com/problems/two-sum-iii-data-structure-design/ 题目: Design and implement a ...

  3. leetcode 211. Add and Search Word - Data structure design Trie树

    题目链接 写一个数据结构, 支持两种操作. 加入一个字符串, 查找一个字符串是否存在.查找的时候, '.'可以代表任意一个字符. 显然是Trie树, 添加就是正常的添加, 查找的时候只要dfs查找就可 ...

  4. leetcode Add and Search Word - Data structure design

    我要在这里装个逼啦 class WordDictionary(object):def __init__(self):"""initialize your data str ...

  5. TRIE - Data Structure

    Introduction 介绍 Trie,又称单词查找树,是一种树形结构,用于保存大量的字符串.它的优点是:利用字符串的公共前缀来节约存储空间. Trie is an ordered tree dat ...

  6. 牛客小白月赛11:Rinne Loves Data Structure

    Rinne Loves Data Structure 思路 我们插入的位置大概分了四种: 第一种 显然我们找到比当前插入的值的pre,也就是比当前节点大的最小值. 第二种 我们只要找到当前节点的suc ...

  7. HDU - 7072 Boring data structure problem 双端队列 + 思维

    传送门 文章目录 题意: 思路: 题意: 你需要实现如下四个操作 q≤1e7q\le1e7q≤1e7 思路: 做的时候想了个链表的思路让队友写了,懒. 看了题解感觉题解还是很妙的. 你需要快速插入一个 ...

  8. HDU - 6967 G I love data structure 线段树维护矩阵 + 细节

    传送门 文章目录 题意: 思路: 题意: 给你两个长度为nnn的数组a,ba,ba,b,你需要完成如下四种操作: 思路: 思路还是比较简单的,首先建一颗线段树,线段树中维护a,b,a2,b2,aba, ...

  9. 170. Two Sum III - Data structure design【easy】

    170. Two Sum III - Data structure design[easy] Design and implement a TwoSum class. It should suppor ...

最新文章

  1. Nat. Commun. | AI语言工具揭示分子运动
  2. 2018.8.18 servlet使用的会话跟踪除session外还有哪些方式
  3. MACD 的数学解释
  4. 安卓键盘加上数字_HHKB Professional HYBRID静电容键盘图赏
  5. 【2018.3.31】模拟赛之三-ssl2408 比萨【搜索,dfs】
  6. linux c 错误码大全及错误的捕获
  7. c语言双精度百分号,C语言输出百分号%的方法和示例
  8. 平均15-16薪,汇量科技2021届秋招正式启动!
  9. 动态改变标题_小米相册更新,新增动态换天/赛博朋克/MIUI12界面等等!
  10. 【DCVRP】基于matlab遗传和粒子群算法求解带容量的车辆路径规划问题【含Matlab源码 1034期】
  11. 华为HCIP(HCNP) RS路由交换认证考试学习心得体会(含考试内容和所占比例、ensp模拟器、221、222、223练习题下载)
  12. SMT离线编程软件,SMT编程软件,最专业的SMT编程软件,首选JDS,smt... SMTI离线编程软件:适用于所有 SMT AI 设备。JDS编程软件是目前最专业最好用的SMT编程软件,具有“
  13. IPv6网络流量分析及性能监控
  14. IBM深陷云计算业务欺诈丑闻,遭股东集体诉讼
  15. Nodejs修改镜像以及缓存路径
  16. 一篇联想员工写的:联想不是我的家
  17. 爱签电子合同怎么签,应该注意哪些问题?
  18. ppt学习06——排版
  19. 20年嵌入式工程师经验分享:从0开发一款嵌入式产品-道合顺大数据Infinigo
  20. 书法练习轨迹ReadMe

热门文章

  1. Modbus-RTU通讯协议中CRC校验码的计算步骤及算法代码
  2. vue项目查看vue版本及cli版本
  3. linux 编写写汇编程序,三.编写简单的汇编启动程序
  4. 寒假“kmp,hash”题解
  5. Leecode:给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数
  6. macbook安装idea
  7. babel-core 和 babel-loder的作用
  8. ubuntu20开机后没声音
  9. 【漏洞复现】和信创天云桌面系统—任意文件上传
  10. MFC 如何将DWORD类型转换成CString放入ListBox中