【9】数据结构的串篇章

目录标题

    • 串的定义
    • 顺序串的实现
        • 初始化
        • 赋值
        • 打印串
        • 求串的长度
        • 复制串
        • 判断两个串长度是否相等
        • 连接两个串
        • 比较两个串内容是否相等
        • 插入操作
        • 删除操作
        • 调试与代码合集
    • 串的模式匹配算法
      • 朴素的模式匹配算法
      • KMP算法实现模式匹配

串的定义

  • 定义:由0个或多个字符组成的有限序列,由一对双引号引起来。记为"S"

顺序串的实现

初始化
    def __init__(self):"""串初始化"""self.str = list()self.length = ()
赋值
    def strAssign(self, string):"""赋值:param string: 待赋值的串:return:"""# 计算串的长度length = len(string)# 赋值self.str = list()for i in range(length):self.str.append(string[i])# 设置串的长度self.length = length
打印串
    def display(self):"""打印:return:"""print('当前串的长度:', end='')for i in range(self.length):print(self.str[i], end='')print()
求串的长度
    def getLength(self):"""求串的长度:return: 串的长度"""return self.length
复制串
    def strCopy(self, string):"""复制串:param string: 待复制的串:return:"""# 将当前串初始化self.str = list()# 循环复制for char in string.str:self.str.append(char)# 设置当前串的长度self.length = string.getLength()
判断两个串长度是否相等
    def strEquals(self, string):"""判断两个串是否相等:param string: 待判定是否相等的串:return: 是否相等 true or false"""if self.length == string.getLength():# 循环,逐一比较for i in range(self.length):if self.str[i] != string.str[i]:break# 判断,如果i等于串的长度,则相等:否则不相等i += 1if i == self.length:return Trueelse:return Falseelse:return False
连接两个串
    def strConnect(self, string2):"""连接两个串:param string2: 串2:return:"""# 生成新串,并初始化newString = String()# 循环for i in range(self.length):newString.str.append(self.str[i])# 循环for i in range(string2.getLength()):newString.str.append(string2.str[i])# 设置串的长度newString.length = self.length + string2.getLength()return newString
比较两个串内容是否相等
    def strCompete(self, string):"""两个串比较大小:param string: 带比较大小的串:return: 1为大于,0为等于,-1为小于"""# 循环,逐个比较两个串相应位置的字符大小index = 0while index < self.length and index < string.getLength():if self.str[index] > string.str[index]:return 1elif self.str[index] < string.str[index]:return -1index += 1# 判断两个串是否还有字符,还存在字符的串大if index < self.length:return 1elif index < string.getLength():return -1else:return 0
插入操作
    def insert(self, offset, string):"""插入:param offset: 插入位置:param string::return:"""# 判断位置是否正确if offset < 0 or offset > self.length:print("插入位置不合法!")return# 备份当前串temp = self.str# 初始化串self.str = list()for i in range(offset):self.str.append(temp[i])# 将待插入的串存入当前串for i in range(string.getLength()):self.str.append(string.str[i])# 将目标串剩余字符存入当前串for i in range(offset, self.length):self.str.append(temp[i])# 设置串的长度self.length = self.length + string.getLength()
删除操作
    def delete(self, offset, len):"""删除:param offset: 删除开始位置:param len: 删除长度:return:"""# 判断位置与长度是否合法if offset < 0 or offset > self.length or len > self.length - offset:print('删除位置不合法!')return# 备份当前串temp = self.str# 初始化串self.str = list()for i in range(offset):self.str.append(temp[i])# 将目标串剩余的字符存入当前串for i in range(offset + len, self.length):self.str.append(temp[i])# 设置串的长度self.length = self.length - len
调试与代码合集
class String:"""串的定义"""def __init__(self):"""串初始化"""self.str = list()self.length = ()def strAssign(self, string):"""赋值:param string: 待赋值的串:return:"""# 计算串的长度length = len(string)# 赋值self.str = list()for i in range(length):self.str.append(string[i])# 设置串的长度self.length = lengthdef display(self):"""打印:return:"""print('当前串的长度:', end='')for i in range(self.length):print(self.str[i], end='')print()def getLength(self):"""求串的长度:return: 串的长度"""return self.lengthdef strCopy(self, string):"""复制串:param string: 待复制的串:return:"""# 将当前串初始化self.str = list()# 循环复制for char in string.str:self.str.append(char)# 设置当前串的长度self.length = string.getLength()def strEquals(self, string):"""判断两个串是否相等:param string: 待判定是否相等的串:return: 是否相等 true or false"""if self.length == string.getLength():# 循环,逐一比较for i in range(self.length):if self.str[i] != string.str[i]:break# 判断,如果i等于串的长度,则相等:否则不相等i += 1if i == self.length:return Trueelse:return Falseelse:return Falsedef strConnect(self, string2):"""连接两个串:param string2: 串2:return:"""# 生成新串,并初始化newString = String()# 循环for i in range(self.length):newString.str.append(self.str[i])# 循环for i in range(string2.getLength()):newString.str.append(string2.str[i])# 设置串的长度newString.length = self.length + string2.getLength()return newStringdef strCompete(self, string):"""两个串比较大小:param string: 带比较大小的串:return: 1为大于,0为等于,-1为小于"""# 循环,逐个比较两个串相应位置的字符大小index = 0while index < self.length and index < string.getLength():if self.str[index] > string.str[index]:return 1elif self.str[index] < string.str[index]:return -1index += 1# 判断两个串是否还有字符,还存在字符的串大if index < self.length:return 1elif index < string.getLength():return -1else:return 0def insert(self, offset, string):"""插入:param offset: 插入位置:param string::return:"""# 判断位置是否正确if offset < 0 or offset > self.length:print("插入位置不合法!")return# 备份当前串temp = self.str# 初始化串self.str = list()for i in range(offset):self.str.append(temp[i])# 将待插入的串存入当前串for i in range(string.getLength()):self.str.append(string.str[i])# 将目标串剩余字符存入当前串for i in range(offset, self.length):self.str.append(temp[i])# 设置串的长度self.length = self.length + string.getLength()def delete(self, offset, len):"""删除:param offset: 删除开始位置:param len: 删除长度:return:"""# 判断位置与长度是否合法if offset < 0 or offset > self.length or len > self.length - offset:print('删除位置不合法!')return# 备份当前串temp = self.str# 初始化串self.str = list()for i in range(offset):self.str.append(temp[i])# 将目标串剩余的字符存入当前串for i in range(offset + len, self.length):self.str.append(temp[i])# 设置串的长度self.length = self.length - lenif __name__ == '__main__':# 16.串string1 = String()str = input('请输入你的第1个串的内容:')string1.strAssign(str)string1.display()print(f"当前string1串的长度为:{string1.getLength()}")# 复制string2 = String()str = input('请输入你的第2个串的内容:')string2.strAssign(str)string2.display()print(f"当前string2串的长度为:{string2.getLength()}")# string1.strCopy(string2)string1.display()print(f"当前string1串的长度为:{string1.getLength()}")# 判断是否相等串result = string1.strEquals(string2)if result:print('两个串相等')else:print('两个串不相等')# 连接两个串string3 = string1.strConnect(string2)string3.display()print(f"当前string3串的长度为:{string3.length}")# 两个串比较大小result = string1.strCompete(string2)if result == 1:print('string1 大于 string2')elif result == -1:print("string1 小于 string2")else:print('string1 等于 string2')# 插入string1.insert(3, string2)string1.display()print(f"当前string1的长度为:{string1.length}")# 删除string1.delete(3, 2)string1.display()print(f"当前string1的长度为:{string1.length}")

串的模式匹配算法

朴素的模式匹配算法

  • 核心思路
    • 也称为暴力搜索算法。
    • 从目标串S的第一个字符开始与模式串P的第一个字符进行匹配
    • 如果匹配,继续逐个匹配后续字符,
    • 如果不匹配,模式串P返回到第一个字符,与目标串S的第二个字符进行匹配,
    • 如果匹配,继续逐个匹配后续字符,
    • 如果不匹配,模式串P返回到第一个字符,与目标串S的第三个字符进行匹配,
    • 以此类推…
  • 最好情况:从第一个字符开始就匹配成功,模式串数量m,则时间复杂度为O(m)
  • 最坏情况:没有匹配成功,每次匹配比较m次,共匹配n-m+1次,时间复杂度为O(n×m).
  • 代码实现
def bruteForce(string1, string2):"""暴力模式匹配:param string2::return:"""i = 0j = 0while i < len(string1) and j < len(string2):if string1[i] == string2[j]:j += 1i += 1else:i = i-j+1j = 0# 如果找到返回索引if j == len(string2):index = i - len(string2)# 否则返回-1else:index = -1return indexif __name__ == '__main__':string1 = "ababdabcd"string2 = "abc"print(bruteForce(string1, string2) + 1)

KMP算法实现模式匹配

  • 核心思路
    • next列表的设计与生成。

    • 使用前后缀列表的方式去解析next值的设定

    • 其中:

      • 前缀列表表示除去最后一个字符后的前面所有子串组成的集合;
      • 后缀列表表示除去第一个字符后的后面所有子串组成的集合。
    • 以“abcabd”为例,求的next列表

    • 1.串‘a’的前缀和后缀均为空集,最长共有元素长度为0,

    • 2.串“ab”的前缀为{“a”},后缀集合为{‘b’},没有相同的前后缀的子串,最长共有元素长度为0,

    • 3.串“abc”的前缀集合为{“a”,“ab”},后缀为{“c”,“bc”},没有相同的前后缀的子串,最长共有元素长度为0,

    • 4.串“abca”的前缀集合为{“a”,“ab”,“abc”},后缀为{“a”,“ca”,“bca”},相同的前后缀子串为“a”,最长共有元素长度为1,

    • 5.串“abcab”的前缀集合为{“a”,“ab”,“abc”,“abca”},后缀为{“b”,“ab”,“cab”,“bcab”},相同的前后缀子串为“ab”,最长共有元素长度为2,

    • 6.串“abcabd”的前缀集合为{“a”,“ab”,“abc”,“abca”,“abcab”},后缀为{“d”,“bd”,“abd”,“cabd”,“bcabd”},没有相同的前后缀子串,最长共有元素长度为0,

    • 7.最后得出字符串“abcabd”的next列表为[-1,0,0,0,1,2].

  • 代码实现
def createNext(pattern):length = len(pattern)# 定义next列表next = [0 for _ in range(len(pattern))]next[0] = -1next[1] = 0# 计算next列表k = -1j = 0while j < length-1:if pattern[k] == pattern[j] or k == -1:j += 1k += 1next[j] = kelse:k = next[k]print(next)return nextdef kmpSearch(text, pattern):# 得到next列表next = createNext(pattern)# 匹配字符串i = 0j = 0while i < len(text) and j < len(pattern):if text[i] == pattern[j] or j == -1:i += 1j += 1else:j = next[j]if j >= len(pattern):return Trueelse:return Falseif __name__ == '__main__':text = "ababdabcabcabd"pattern = "abcabd"print(kmpSearch(text, pattern))

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

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

相关文章

GMSL Strapping Pins CFG0/CFG1 应用

GMSL device 使用起来还是比较简单 ADI 已经充分考虑了用户的需求&#xff0c;尽可能的降低的芯片的使用和配置复杂度 一对加串器和解串器&#xff0c;只要工作模式匹配得当&#xff0c;Link Locked&#xff0c;便能够正常工作 如果遇到 Link 无法建立&#xff08;Locked&…

`uia.WindowControl` 是什么:获取窗口文字是基于系统的 UI 自动化接口,而非 OCR 方式

uia.WindowControl 是什么:获取窗口文字是基于系统的 UI 自动化接口,而非 OCR 方式 uia.WindowControl 通常是基于 Windows 系统的 UI 自动化框架(如 pywinauto 中的 uia 模块)里用于表示窗口控件的类。在 Windows 操作系统中,每个应用程序的窗口都可以看作是一个控件,ui…

Easysearch VS Opensearch 数据写入与存储性能对比

本文记录 Easysearch 和 Opensearch 数据写入和数据存储方面的性能对比。 准备 压测工具&#xff1a;INFINI Loadgen 对比版本&#xff1a; Easysearch 1.11.1&#xff08;lucene 8.11.4&#xff09;Opensearch 2.19.1&#xff08;lucene 9.12.1&#xff09; 节点 JVM 配置…

力扣题解:142. 环形链表 II

在链表学习中&#xff0c;我们已经了解了单链表和双链表&#xff0c;两者的最后一个结点都会指向NULL&#xff1b;今天我们介绍的循环列表则不同&#xff0c;其末尾结点指向的这是链表中的一个结点。 循环链表是一种特殊类型的链表&#xff0c;其尾节点的指针指向头节点&#…

区间 dp 系列 题解

1.洛谷 P4342 IOI1998 Polygon 我的博客 2.洛谷 P4290 HAOI2008 玩具取名 题意 某人有一套玩具&#xff0c;并想法给玩具命名。首先他选择 W, I, N, G 四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好&#xff0c;将名字中任意一个字母用 W, I, N, G …

天基光学图像仿真原理简介

一、原理简介 天基光学图像仿真通过数学模型和算法模拟空间目标在光学系统中的成像过程&#xff0c;核心原理可归纳为以下四部分&#xff1a; 1. 目标与背景建模‌ 目标运动建模‌&#xff1a;利用轨道动力学模型&#xff08;如SGP4&#xff09;解析空间目标轨迹&#xff0c;…

Jetpack Compose 状态保存机制全面解析:让UI状态持久化

在Android开发中&#xff0c;Jetpack Compose 的状态管理是一个核心话题&#xff0c;而状态保存则是确保良好用户体验的关键。本文将深入探讨Compose中各种状态保存技术&#xff0c;帮助你在配置变更和进程重建时保持UI状态。 一、基础保存&#xff1a;rememberSaveable reme…

【Json-Rpc #1】项目背景及环境搭建

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人博客&#xff1a;island ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活总是不会一帆风顺&#xff0c;前进…

WPF轮播图动画交互 动画缩放展示图片

WPF轮播图动画交互 动画缩放展示图片 效果如下图&#xff1a; XAML代码&#xff1a; <Window x:Class"Caroursel.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/20…

为什么 npm list -g 没显示 node_modules?✨

揭秘&#xff1a;为什么 npm list -g 没显示 node_modules&#xff1f;&#x1f575;️‍♂️✨ 嗨&#xff0c;各位代码探险家&#xff01;&#x1f44b; 今天我们要破解一个 npm 小谜团&#xff1a;运行 npm list -g --depth0 时&#xff0c;为什么输出的路径里看不到 node_…

都江堰与郑国渠

目录标题 一、历史背景&#xff1a;地缘博弈下的水利突围都江堰&#xff1a;化水患为天府的千年大计郑国渠&#xff1a;间谍引发的战略反转 二、工程智慧&#xff1a;超越时代的科技奇迹都江堰&#xff1a;生态治水的典范郑国渠&#xff1a;泥沙资源化的创举 三、后世影响&…

链路聚合+vrrp

1.链路聚合 作用注意事项将多个物理接口&#xff08;线路&#xff09;逻辑上绑定在一起形成一条逻辑链路&#xff0c;起到叠加带宽的作用1.聚合接口必须转发速率一致。2.聚合设备两端必须一致 配置命令 方法一 [Huawei]interface Eth-Trunk 0----先创建聚合接口&#xff0c;…

【STM32单片机】#7 定时器输入捕获

主要参考学习资料&#xff1a; B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装&#xff1a;STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 实验&…

【android bluetooth 框架分析 01】【关键线程 3】【bt_jni_thread 线程介绍】

1. bt_jni_thread 职责介绍 bt_jni_thread 这个线程的作用是专门负责处理蓝牙 JNI 层的消息循环&#xff0c;也可以说是 C 层和 Java 层交互的桥梁线程。 1.1 什么是 JNI 层&#xff1f;为什么需要这个线程&#xff1f; JNI&#xff08;Java Native Interface&#xff09;是 …

基于视觉语言模型的机器人实时探索系统!ClipRover:移动机器人零样本视觉语言探索和目标发现

作者&#xff1a;Yuxuan Zhang 1 ^{1} 1, Adnan Abdullah 2 ^{2} 2, Sanjeev J. Koppal 3 ^{3} 3, and Md Jahidul Islam 4 ^{4} 4单位&#xff1a; 2 , 4 ^{2,4} 2,4佛罗里达大学电气与计算机工程系RoboPI实验室&#xff0c; 1 , 3 ^{1,3} 1,3佛罗里达大学电气与计算机工程系F…

SpringBoot和微服务学习记录Day2

微服务 微服务将单体应用分割成更小的的独立服务&#xff0c;部署在不同的服务器上。服务间的关联通过暴露的api接口来实现 优点&#xff1a;高内聚低耦合&#xff0c;一个模块有问题不影响整个应用&#xff0c;增加可靠性&#xff0c;更新技术方便 缺点&#xff1a;增加运维…

网站集群批量管理-Ansible剧本与变量

复盘内容&#xff1a;链接指北 查看ansible命令文档 ansible-doc -s systemd一、剧本 何为剧本: playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量 剧本yaml格式,yaml格式的文件:空格,冒号. 剧本未来我们批量管理,运维必会的内容. …

如何在Dify中安装运行pandas、numpy库(离线、在线均支持,可提供远程指导)

pandas和numpy这两个库是数据科学和数据分析中经常使用的工具包&#xff0c;原生的Dify无法直接使用这两个库&#xff0c;需要手动安装后才可以使用。本文将介绍如何在Dify中安装pandas和numpy&#xff0c;并在代码执行节点中运行使用pandas和numpy。 Dify的代码执行节点中的py…

Helm核心概念与常见操作介绍

在管理Kubernetes集群里的应用时&#xff0c;Helm能帮上大忙&#xff0c;它把应用的部署、升级和管理变得简单多了&#xff0c;有如是Kubernetes的 “应用商店”。 Helm的三个重要概念 三大概念最直接的理解&#xff1a;Helm 安装 charts 到 Kubernetes 集群中&#xff0c;每…

rkmpp 解码 精简mpi_dec_test.c例程

rkmpp 解码流程&#xff08;除 MPP_VIDEO_CodingMJPEG 之外&#xff09; 源码 输入h264码流 输出nv12文件 /** Copyright 2015 Rockchip Electronics Co. LTD** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file exce…