【串——数据结构】

定义串,即字符串(String)是由零个或多个字符组成的有限序列.
术语:串长、空串、空格串、子串、主串、字符在主串中的位置、子串在主串中的位置

  1. 串的定义和性质:了解串的基本定义,包括如何表示、如何存储、如何操作串以及串的基本性质,比如长度、空串等。

  2. 串的基本操作:掌握对串进行的基本操作,如串的赋值、串的连接、串的比较、串的子串提取等。

  3. 串的存储结构:了解串的不同存储结构,比如顺序存储结构和链式存储结构,以及它们各自的优缺点。

  4. 串的模式匹配:掌握串的模式匹配算法,如朴素的暴力匹配算法、KMP算法、Boyer-Moore算法等,理解它们的原理和实现。

  5. 串的应用:了解串在实际中的应用,比如文本编辑器中的搜索功能、编译器中的词法分析、生物信息学中的序列比对等。

  6. 串的高级操作:了解一些高级的串操作,如串的替换、串的插入、串的删除等。

  7. 串的扩展:了解一些扩展的串结构,比如循环串、定长串等,以及它们的特点和应用场景。

  8. 串的算法复杂度:理解对串进行操作的算法的时间和空间复杂度,以便能够评估算法的效率和性能。

串的存储结构主要有两种:顺序存储结构链式存储结构

  1. 顺序存储结构:串的顺序存储结构通常使用一维数组来实现。在这种结构中,串中的字符被顺序地存储在一片连续的存储空间中。每个字符占用一个存储单元,通过数组下标可以访问串中的任意一个字符。这种结构适合于对串进行频繁的随机存取和修改操作。

  2. 链式存储结构:串的链式存储结构使用链表来实现。在链式结构中,每个节点存储一个字符,同时包含一个指向下一个节点的指针。通过节点之间的链接,可以将字符依次串起来形成一个完整的串。这种结构适合于对串进行频繁的插入和删除操作。

串的模式匹配是一种常见的算法问题,其目标是在一个主串中查找一个模式串是否存在,并找到所有匹配的位置。常见的模式匹配算法包括:

  1. 朴素的暴力匹配算法:从主串的第一个字符开始,依次与模式串进行比较,如果不匹配,则主串向后移动一位,直到找到匹配的位置或主串结束。这种算法的时间复杂度为O(m*n),其中m和n分别是主串和模式串的长度。
    算法思想
    在这里插入图片描述

  2. KMP算法:KMP算法通过预处理模式串,构建一个部分匹配表(next数组),利用这个表在匹配过程中避免回溯。它的时间复杂度为O(m+n),其中m和n分别是主串和模式串的长度。
    算法思想
    在这里插入图片描述

def getNext(pattern):next = [-1] * len(pattern)i, j = 0, -1while i < len(pattern) - 1:if j == -1 or pattern[i] == pattern[j]:i += 1j += 1if pattern[i] != pattern[j]:next[i] = jelse:next[i] = next[j]else:j = next[j]return nextdef KMP(text, pattern):next = getNext(pattern)i, j = 0, 0while i < len(text) and j < len(pattern):if j == -1 or text[i] == pattern[j]:i += 1j += 1else:j = next[j]if j == len(pattern):return i - jelse:return -1# Example usage:
text = "ABCABCDABABCDABCDABDE"
pattern = "ABCDABD"
print("Pattern found at index:", KMP(text, pattern))

这段代码中,getNext 函数用于生成模式串的 next 数组,KMP 函数则是实现了KMP算法。在 KMP 函数中,通过不断移动模式串的位置,并根据 next 数组进行跳跃,以在主串中寻找匹配的子串。

  1. Boyer-Moore算法:Boyer-Moore算法采用了启发式的策略,在匹配过程中利用模式串中的信息进行跳跃式的移动。它的时间复杂度通常为O(m*n),但在实际中通常比KMP算法表现更好。
    Boyer-Moore算法是一种用于字符串匹配的高效算法,它通过预处理模式串和文本串,利用字符比较的结果来跳过尽可能多的无效比较。下面是Boyer-Moore算法的C++代码实现:
#include <iostream>
#include <vector>
#include <string>using namespace std;// 构建坏字符规则表
void buildBadCharTable(const string& pattern vector<int>& badCharTable) {int m = pattern.length();for (int i = 0; i < 256; i++) {badCharTable[i] = m;}for (int i = 0; i < m - 1; i++) {badCharTable[pattern[i]] = m - 1 - i;}
}// 构建好后缀规则表
void buildGoodSuffixTable(const string& pattern, vector<int>& goodSuffixTable) {int m = pattern.length();vector<int> suffix(m, 0);goodSuffixTable.resize(m, m);// Case 1: 模式串的后缀与整个模式串匹配int j = 0;for (int i = m - 1; i >= 0; i--) {if (pattern[i] == pattern[j]) {suffix[i] = j + 1;j++;} else {suffix[i] = j;j = 0;}}// Case 2: 模式串的后缀是模式串的前缀for (int i = 0; i < m - 1; i++) {int len = m - suffix[i];goodSuffixTable[len] = m - 1 - i;}
}// Boyer-Moore算法
int boyerMoore(const string& text, const string& pattern) {int n = text.length();int m = pattern.length();vector<int> badCharTable(256, 0);vector<int> goodSuffixTable(m, m);buildBadCharTable(pattern, badCharTable);buildGoodSuffixTable(pattern, goodSuffixTable);int i = 0;while (i <= n - m) {int j = m - 1;while (j >= 0 && pattern[j] == text[i + j]) {j--;}if (j < 0) {return i;  // 匹配成功,返回匹配的起始位置} else {int badCharShift = badCharTable[text[i + j]] - m + 1 + j;int goodSuffixShift = goodSuffixTable[m - j];i += max(badCharShift, goodSuffixShift);}}return -1;  // 匹配失败,返回-1
}int main() {string text = "ABCDABDABCDABCD";string pattern = "ABCD";int pos = boyerMoore(text, pattern);if (pos != -1) {cout << "Pattern found at position: " << pos << endl;} else {cout << "Pattern not found." << endl;}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如果在 Ubuntu 系统中两个设备出现两个相同的端口号解决方案

问题描述&#xff1a; 自己的移动机器人在为激光雷达和IMU配置动态指定的端口时&#xff0c;发现激光雷达和深度相机配置的 idVendor 和 idProduct 相同&#xff0c;但是两个设备都具有不同的ttyUSB号&#xff0c;如下图所示 idVendor&#xff1a;代表着设备的生产商ID,由USB设…

EasyExcel 模板导出excel、合并单元格及单元格样式设置。 Freemarker导出word 合并单元格

xls文件&#xff1a; 后端代码&#xff1a; InputStream filePath this.getClass().getClassLoader().getResourceAsStream(templateFile);// 根据模板文件生成目标文件ExcelWriter excelWriter EasyExcel.write(orgInfo.getFilename()).excelType(ExcelTypeEnum.XLS).withTe…

App测试中ios和Android的区别

1、Android长按home键呼出应用列表和切换应用&#xff0c;然后右滑则终止应用&#xff1b; 2、多分辨率测试&#xff0c;Android端20多种&#xff0c;ios较少&#xff1b; 3、手机操作系统&#xff0c;Android较多&#xff0c;ios较少且不能降级&#xff0c;只能单向升级&…

论文笔记 - :DIGGING INTO OUTPUT REPRESENTATION FOR MONOCULAR 3D OBJECT DETECTION

Title: 深入研究单目 3D 物体检测的输出表示 Abstract 单目 3D 对象检测旨在从单个图像中识别和定位 3D 空间中的对象。最近的研究取得了显着的进展&#xff0c;而所有这些研究都遵循基于 LiDAR 的 3D 检测中的典型输出表示。 然而&#xff0c;在本文中&#xff0c;我们认为…

javaweb学习(day11-监听器Listener过滤器Filter)

一、监听器Listener 1 Listener介绍 Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是&#xff1a;Servlet 程 序、Listener 监听器、Filter 过滤器 Listener 是 JavaEE 的规范&#xff0c;就是接口 监听器的作用是&#xff0c;监听某种变化(一般就是对…

达梦数据库 优化

谁进行优化&#xff1f;优化什么&#xff1f; 优化不能仅从数据库方面考虑&#xff0c;比如&#xff0c;在存储达到数据库极限、应用涉及人员设计的代码稀巴烂的情况下&#xff0c;进行调优就是杯水车薪的效果。 涉及到优化人员&#xff1a; 数据库管理员应用程序架构师应用…

element-ui result 组件源码分享

今日简单分享 result 组件的源码实现&#xff0c;主要从以下三个方面&#xff1a; 1、result 组件页面结构 2、result 组件属性 3、result 组件 slot 一、result 组件页面结构 二、result 组件属性 2.1 title 属性&#xff0c;标题&#xff0c;类型 string&#xff0c;无默…

图神经网络:处理非欧几里得数据的新视角

目录 1. 引言 2.图数据与图神经网络基础 3.GNN模型详解 4.应用案例 4.1. 社交网络分析 4.2. 化学分子性质预测 5.总结 1. 引言 非欧几里得数据指的是那些不遵循传统欧几里得空间几何规则的数据。在欧几里得空间中&#xff0c;数据点之间的距离和形状可以通过标准的几何度…

ubuntu-server部署hive-part3-安装mysql

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本&#xff1a;ubuntu-server-22.04.3 虚拟机&#xff1a;virtualbox7.0 部署mysql 下载上传 下载地址 https://downloads.mysql.com/archives/community/ 以root用户上传&#xff0c;/usr/loc…

JavaEE 初阶篇-深入了解单例模式(经典单例模式:饿汉模式、懒汉模式)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 单例模式的概述 2.0 单例模式 - 饿汉式单例 2.1 关于饿汉式单例的线程安全问题 3.0 单例模式 - 懒汉式单例 3.1 关于懒汉式单例的线程安全问题 3.1.1 加锁 synchr…

【C++】排序算法 --快速排序与归并排序

目录 颜色分类&#xff08;数组分三块思想&#xff09;快速排序归并排序 颜色分类&#xff08;数组分三块思想&#xff09; 给定⼀个包含红⾊、⽩⾊和蓝⾊、共 n 个元素的数组 nums &#xff0c;原地对它们进⾏排序&#xff0c;使得相同颜⾊ 的元素相邻&#xff0c;并按照红⾊、…

【Servlet】服务器内部转发以及客户端重定向

文章目录 一、服务器内部转发&#xff1a;request.getRequestDispatcher("...").forward(request, response);二、客户端重定向&#xff1a;response.sendRedirect("");三、服务器内部转发代码示例四、客户端重定向代码示例 一、服务器内部转发&#xff1a…