数据结构之串

news2024/9/17 8:20:12

1.串的基本概念

• 一个串是由n(n≥0)个字符组成的有限序列,记为s=“s0s1 ⋯ sn-1”,其
中,s是串名,双引号括起来的字符序列s0s1 ⋯ sn-1是串值。
• 一个字符在串中的位置称为该字符在串中的序号,约定串第一个字符
的序号为0。
• 由串s中任意连续字符组成的子序列称为s的子串,s称为主串。 空串是任意串的子串; 任意串都是它自身的子串;除自身外,串的其他子串称为其真子串。
• 子串的序号是指该子串首字符在主串中的序号。
• 两个串相等是指,串长度相同且对应位置上的字符也相同。

2.串的存储结构

(1) 串的顺序存储结构
采用字符数组将串中的字符序列依次存储在数组的相邻单元中。
在这里插入图片描述
顺序串具有随机存取特性,存取指定位置字符的时间复杂度为O(1);
缺点是插入、删除时需要移动数据元素,平均移动数据量是串长度
的一半,插入、删除操作的时间复杂度为O(n)。
(2)串的链式存储结构
串的链式存储结构有单字符链表和块链表两种,如下图所示。
在这里插入图片描述
链式存储的串,存取指定位置字符的时间复杂度为O(n);
单字符链表虽然插入删除操作不需要移动数据元素,但占用存储空间太
多;块链表的插入和删除操作需要移动元素,效率较低。

3.串的模式匹配

定义:设有两个串目标串target和模式串pattern,在目标串target中查找
与模式串pattern相等的一个子串并确定该子串位置的操作称为串的模式
匹配(Pattern Matching)。
匹配结果有两种:如果target中存在与pattern相等的子串,则匹配成
功,获得该子串在target中的位置;否则匹配失败,给出失败信息。

4.模式匹配算法

(1)Brute-Force(BF)算法
BF算法的基本思想是蛮力匹配,即从目标串target的每一 个字符开始依次与模式串pattern的字符进行比较。
(2)KMP算法
KMP算法是一种无回溯的模式匹配算法,它改进了BF算法,目标串不回溯。

5.BF算法描述与实现

 public int indexOf(MyString pattern, int begin) {
        int n = this.length(), m = pattern.length();
        if (begin < 0) //对begin容错,若begin<0,从0开始
            begin = 0;
        if (n == 0 || n < m || begin >= n) //若目标串空、较短或begin越界,不需比较
            return -1;
        int i = begin, j = 0; //i、j分别为目标串和模式串当前字符下标
        int count = 0; //记载比较次数
        while (i < n && j < m) {
            count++;
            if (this.charAt(i) == pattern.charAt(j)) //若当前两字符相等,则继续比较后续字符
            {
                i++;
                j++;
            } else //否则i、j回溯,进行下次匹配
            {
                i = i - j + 1; //目标串下标i,退回到下个匹配子串序号
                j = 0; //模式串下标j,退回到0
                if (i > n - m) //若目标串剩余子串的长度<m,不再比较
                    break;
            }
        }
    }

5.1BF算法算法分析

在这里插入图片描述

6.KMP算法描述与实现

 public static int indexOf(String target, String pattern, int begin)
    {
        int n=target.length(), m=pattern.length();
        if (begin<0) //对begin容错,若begin<0,从0开始
            begin = 0;
        if (n==0 || n<m || begin>=n) //若目标串空、较短或begin越界,不需比较
            return -1;
        next = getNext(pattern); //返回模式串pattern的next数组
        int i=begin, j=0; //i、j分别为目标串、模式串比较字符下标
        while (i<n && j<m)
        {
            if (j==-1 || target.charAt(i)==pattern.charAt(j))
            //若当前两字符相等,则继续比较后续字符
            {
                i++;
                j++;
            }
            else //否则,下次匹配,目标串下标i不回溯
            {
                j=next[j]; //模式串下标j退回到下次比较字符序号
                if (n-i+1<m-j+1) //若目标串剩余子串的长度不够,不再比较
                    break;
            }
        }
        if (j==m) //匹配成功
            return i-j; //返回匹配的子串序号
        return -1; //匹配失败
    }
6.1 计算next数组

KMP算法充分利用前一次匹配的比较结果,由next[j]逐个递推计算得到
next[j+1]。说明如下:
(1)约定next[0]=-1,-1表示下次匹配从ti+1与p0开始比较;有next[1]=0。
(2)如果pk=pj,即”p0…pk-1pk”=“pk-j…pj-1pj”,存在相同的前后缀子串,长度为k+1,则下一个字符pj+1的next[j+1]=k+1=next[j]+1。
例如:”abcabc”,已求得next[4]=1(j=4,k=1),此时p3=p0=‘a’,而p4=p1=‘b’,则”p3p4”=“p0p1”,所以next[5]=next[4]+1=2。
(3)如果pk≠pj,在”p0…pj”中寻找较短的前后缀子串,较短前后缀子串的长度为next[k],则k=next[k];再比较pj与pk,继续执行,寻找相同的前后缀子串。

在这里插入图片描述

 private static int[] getNext(String pattern) 
 //返回模式串pattern的next数组
    {
        int j=0, k=-1, next[]=new int[pattern.length()];
        next[0]=-1;
        while (j<pattern.length()-1)
            if (k==-1 || pattern.charAt(j)==pattern.charAt(k))
            {
                j++;
                k++;
                next[j]=k;
            }
            else k=next[k];
        return next;
    }
5.2 KMP算法分析

KMP算法的最好情况同BF算法,比较次数为m,时间复杂
度为O(m);
最坏情况,比较次数为n,算法的时间复杂度为O(n)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微搭低代码实现表单打印功能

目录 1 引入第三方库2 搭建页面3 实现打印4 实现效果总结 在我们的日常开发场景中&#xff0c;表单打印是一个比较常见的场景&#xff0c;微搭本身不带打印功能&#xff0c;我们需要借助一个第三方的库来实现打印。 1 引入第三方库 在微搭中如果需要引入第三方库的&#xff0…

阿里云免费云服务器领取教程

阿里云推出了免费试用中心&#xff0c;提供超百款免费试用云产品&#xff0c;个人用户与企业用户均可免费试用&#xff0c;云服务器最长免费体验3个月&#xff01; 一、活动地址 阿里云免费试用中心 二、活动对象 满足以下全部条件的阿里云用户&#xff1a; 1、阿里云注册会…

JS模块化规范及进化史

模块化规范及进化史 按照功能和需求分成各个模块&#xff0c;最后再把所有模块合并在一起。当然现在基于webpack vue/react&#xff0c;模块化开发很重要。某个功能板块单独写成一个模块&#xff0c;然后把模块合在一起&#xff0c;最后把整个页面的功能实现。方便团队管理 小插…

stunnel-加密通道-squid-IP缓存服务器-openssl自签名证书

文章目录 1.安装squid2.管理squid服务3.安装Stunnel服务器端4.安装Stunnel客户端5.在目标使用位置开启代理 1.安装squid yum install squid 2.管理squid服务 systemctl start squid systemctl stop squid systemctl status squid 查看端口 netstat -lntpo | grep 8**** 修改配…

集成增益采样电路误差计算--适用INA214

一、 一般集成电路结构如下&#xff1a; 二、 典型的计算步骤如下&#xff1a; 主要误差来源&#xff1a;采样电阻R-shunt&#xff0c;集成增益运放&#xff0c;ADC误差。 采样电阻误差 误差项包括常温下电阻的精度X1%&#xff0c;电阻的温漂值X2% 误差百分比为&#xff1a;…

《C++ Primer》--学习11

关联容器中的元素是按关键字来保存和访问的 两个主要的关联容器类型是 map 和 set。map 中的一个关键字-值&#xff08;key - value&#xff09;对&#xff1a;关键字起到索引作用&#xff0c;值则表示与索引相关联的数据。set 中每个元素只包含一个关键字&#xff1b; 以下八…

Java-数据结构(一)

这里写目录标题 前言一、为什么需要数据结构&#xff1f;1、低效的操作2、占用过多的内存空间3、困难的数据操作 二、枚举&#xff08;Enumeration&#xff09;1、定义2、关键字3、适用场景 三、 位集合&#xff08;BitSet&#xff09;1、定义2、方法3、适用场景 四、向量&…

文件操作 -- C语言

在之前学习的时候&#xff0c;我们可以发现当程序运行完&#xff0c;我们之前保存的数据就会消失&#xff0c;再次运行时还得重新输入&#xff0c;为了使我们保存的数据在下次运行时还能使用&#xff0c;我们这篇文章来学习一下怎么使用文件操作&#xff0c;将我们的数据保存在…

SQL14 操作符混合运用

select device_id,gender,age,university,gpa from user_profile where university山东大学 and gpa>3.5 or university复旦大学 and gpa>3.8;

Linux 抓包工具——tcpdump

1 简介 用简单的话来定义tcpdump&#xff0c;就是&#xff1a;dump the traffic on a network&#xff0c;根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口…

由浅入深探究mysql索引结构原理、性能分析与优化

目录 第一部分&#xff1a;基础知识 第二部分&#xff1a;MYISAM和INNODB索引结构 1、 简单介绍B-tree B tree树 2、 MyisAM索引结构 3、 Annode索引结构 4、 MyisAM索引与InnoDB索引相比较 第三部分&#xff1a;MYSQL优化 1、表数据类型选择 2、sql语句优化 3、系统配置与维护…

Java对称与非对称加密解密(AES与RSA)

尽可能预想所有残酷的可能性、因为现实永远让你无法预警,而且又吝于给人慈悲。——富坚义博 今天我们讨论一下秘钥这个东西 一、对称加密技术与非对称加密技术简述 加密技术可以分为对称与非对称两种。 对称加密、解密即加密与解密用的是同一把秘钥,常用的对称加密技术有DES,A…

MySQL - 连表查询 Join On 详解

1. 连表查询详解 市面上有 7 种连表查询, 总共归为三大类 : 左查询 LEFT JOIN -- 以左表为基准右查询 RIGHT JOIN -- 以右表为基准交叉查询 INNER JOIN -- 查询两表都有的数据 操作描述inner join如果表中至少有一个匹配, 就返回行left join会从左表中返回所有的值…

IDEA 设置文件头的注释信息author,date,description

打开setting设置窗口 file and code Templates 2、编辑Class模版 /*** Author:${USER}* Date:${YEAR}-${MONTH}-${DAY}* Description:TODO* */ 创建一个新JAVA类&#xff0c;测试一下&#xff0c;OK

chatgpt赋能python:如何通过Python赚取外快:SEO技巧分享

如何通过Python赚取外快&#xff1a;SEO技巧分享 作为一名有10年Python编程经验的工程师&#xff0c;我发现Python不仅用来写代码&#xff0c;还可以用来赚取外快。SEO是一个非常赚钱的市场&#xff0c;而Python可以帮助我们更好地优化网站&#xff0c;从而实现更高的排名&…

一步一步学OAK之四:实现如何在低延迟下使用高分辨率视频

目录 Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 创建pipelineSetup 5: 创建节点Setup 6: 设置节点的属性和参数。Setup 7: 建立链接关系Setup 8: 连接设备并启动管道Setup 9: 创建与DepthAI设备通信的输入队列和输出队列Setup 10: 主循环获取视频帧显示…

深度学习与神经网络阅读笔记(持续更新)

深度学习与神经网络阅读笔记&#xff08;持续更新&#xff09; 机器学习基础绪论人工智能主要领域可分为如下&#xff1a;人工智能的发展史&#xff1a;机器学习表示学习深度学习 线性模型Logistic回归Softmax回归感知器支持向量机总结对比 基础模型循环神经网络应用到机器学习…

MongoTemplate手动动态创建(简版)

1、背景 最近遇到一个需求&#xff0c;就是动态获取springboot中MongoTemplate&#xff0c;有哪些mongo数据库在项目启动的时候不确定&#xff0c;运行过程中有可能会增加&#xff0c;也有可能减少。只能通过一个接口获取所有mongo数据库的地址。但是springboot本身提供的mong…

panda3d 模型转换命令复习学习

在此学习了把maya模型转换为panda3d的egg格式&#xff1b; 在Panda3d中转换Maya模型为egg格式并使用pview查看_panda3d egg文件浏览器_bcbobo21cn的博客-CSDN博客 下面继续看一下模型转换命令&#xff1b;列出带 egg 字符串的命令&#xff1b; 先复习一下&#xff0c;可以把m…

Java -- XXL-JOB分布式任务调度平台

XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用 xxl是xxl-job的开发者大众点评的【许雪里】名称的拼音开头 官网地址 分布式任务调度平台XXL-JOB 文档地址…