数据结构与算法----复习Part 12 (字符串初步)

本系列是算法通关手册LeeCode的学习笔记

算法通关手册(LeetCode) | 算法通关手册(LeetCode) (itcharge.cn)

 

目录

一,字符串(String)

二,字符串的比较

三,字符串的存储结构

四,字符串匹配(String Matching)


一,字符串(String)

        简称为串,是由零个或多个字符组成的有限序列。

        字符变量:字符串每一个位置上的元素都是一个字符变量;

        字符串的长度 n :字符串中字符的数目;

        空串:零个字符构成的串也称为【空字符串(Null String)】,长度为0;

        子串:字符串中任意个连续的字符组成的子序列称为该字符串的【子串(Substring)】,

                   有两种特殊字串:

                                起始位置为 0,长度为 k 的子串称为【前缀(Prefix)】;

                                终止位置为 n - 1,长度为 k 的子串称为【后缀(Suffix)】;

        主串:包含子串的字符串称为【主串】。

        可见字符串与数组有很多相似之处,同样使用名称【下标】的方式来访问一个字符。

单独讨论字符串的原因:

        字符串中的数据元素都是字符,结构相对简单,但规模可能比较庞大;

        经常需要把字符串作为一个整体来使用和处理,操作对象一般不是某个数据元素,而是一组数据元素;

        经常需要考虑多个字符串之间的操作,比如:字符串之间的连接、比较操作。

根据字符串的特点,可将字符串问题分为以下几种:

        字符串匹配问题;

        子串相关问题;

        前缀 / 后缀相关问题;

        回文串相关问题;

        子序列相关问题。

二,字符串的比较

        字符串str1, str2 相等:

                1,len(str1) == len(str2);

                2,str1 和 str2 对应位置上的各个字符都相同。

        字符串比较的依据是编码大小,通常为 ASCII 码。

        首先比较对应位置的字符:

                ' abc ' < ' ad '

        后比较长度:

                ' ab ' < ' aba '

三,字符串的存储结构

        字符串的存储结构与线性表相同,分为【顺序存储结构】和【链式存储结构】。

字符串的顺序存储

        字符串的顺序存储结构也是使用一组地址连续的存储单元依次存放串中的各个字符,按照预定义的大小为每个定义的字符串变量分配一个固定长度的存储区域,一般是用定长数组定义。

        字符串顺序存储中每一个字符元素都有自己的下标索引。

字符串的链式存储结构

        字符串的存储也可以采用链式存储结构,即采用一个线性链表来存储一个字符串,字符串的链节点包含一个用于存储字符的 data 变量,和指向下一个链节点的指针变量 next。

        通常情况下,链节点的字符长度为 1 或者 4,这是为了避免浪费空间。当链节点的字符长度为 4 时,由于字符串的长度不一定是 4 的倍数,因此字符串所占用的链节点中最后那个链节点 data 变量可能没有占满,可以使用 # 或其他不属于字符集的特殊字符将其补全。

不同语言中的字符串

        C语言中字符串使用空字符 \0 结尾的字符数组;

        C++ 中引入 string 类型,完全可以代替 C 中的字符数组或字符串指针;        

        Java 语言的标准库中也提供了 String 类作为字符串库;

        Python 语言中使用 str 对象来代表字符串。 str 对象是一种不可变类型对象,即 str 类型创建

        的字符串在对象定义之后无法更改字符串的长度,也无法改变或删除字符串中的字符。

四,字符串匹配(String Matching)

        又称模式匹配(Pattern Matching),可以简单理解为给定字符串 T 和 p,在主串 T 中寻找子串 p。主串又被称为文本串,子串 p 又被称为模式串(Pattern)

        字符串匹配问题可分为【单模式串匹配问题】和【多模式串匹配问题】

        由于两个问题涉及的算法较多,会分篇学习,本篇内容作为字符串初步到此为止,以下附上有关本篇内容的几道例题,由于数组与字符串的相似性,例题中也使用了数组中指针的思想。

125. 验证回文串 - 力扣(LeetCode)

class Solution:
    def isPalindrome(self, s: str) -> bool:
        left = 0
        right = len(s) - 1
        while left < right:
            if not s[left].isalnum():
                left += 1
                continue
            if not s[right].isalnum():
                right -= 1
                continue
            if s[left].lower() == s[right].lower():
                left += 1
                right -= 1
            else:
                return False
        return True

3. 无重复字符的最长子串 - 力扣(LeetCode)

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        left = 0
        right = 0
        window = dict()
        ans = 0
        while right < len(s):
            if s[right] not in window:
                window[s[right]] = 1
            else:
                window[s[right]] += 1
            while window[s[right]] > 1:
                window[s[left]] -= 1
                left += 1
            
            ans = max(ans, right - left + 1)
            right += 1
        return ans

344. 反转字符串 - 力扣(LeetCode)

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        if len(s) < 2:
            return
        left = 0
        right = len(s) - 1
        while left <= right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1
        return 

415. 字符串相加 - 力扣(LeetCode)

class Solution:
    def addStrings(self, num1: str, num2: str) -> str:
        # num1 位数
        digit1 = len(num1) - 1
        # num2 位数
        digit2 = len(num2) - 1

        # 进位
        carry = 0
        sum = []
        # 逆序相加
        while carry > 0 or digit1 >= 0 or digit2 >= 0:
            # 获取对应位数上的数字
            num1_d = int(num1[digit1]) if digit1 >= 0 else 0
            num2_d = int(num2[digit2]) if digit2 >= 0 else 0
            digit1 -= 1
            digit2 -= 1
            # 计算结果,存储,进位
            num = num1_d+num2_d+carry
            sum.append('%d'%(num%10))
            carry = num // 10
        # 返回计算结果
        return "".join(sum[::-1])

151. 反转字符串中的单词 - 力扣(LeetCode)

class Solution:
    def reverseWords(self, s: str) -> str:
        if len(s) < 2:
            return s
        ss = s.split()
        left = 0
        right = len(ss) - 1
        res = ''
        while left <= right:
            ss[left], ss[right] = ss[right], ss[left]
            left += 1
            right -= 1
        for i in range(len(ss) - 1):
            res += ss[i]
            res += ' '
        return res + ss[-1]

43. 字符串相乘 - 力扣(LeetCode)

class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        if num1 == "0" or num2 == "0":
            return "0"

        len1, len2 = len(num1), len(num2)
        nums = [0 for _ in range(len1 + len2)]

        for i in range(len1 - 1, -1, -1):
            digit1 = int(num1[i])
            for j in range(len2 - 1, -1, -1):
                digit2 = int(num2[j])
                nums[i + j + 1] += digit1 * digit2

        for i in range(len1 + len2 - 1, 0, -1):
            nums[i - 1] += nums[i] // 10
            nums[i] %= 10

        if nums[0] == 0:
            ans = "".join(str(digit) for digit in nums[1:])
        else:
            ans = "".join(str(digit) for digit in nums[:])
        return ans

14. 最长公共前缀 - 力扣(LeetCode)

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        res = strs[0]
        if len(strs) < 2:
            return res
        for i in range(1, len(strs)):
            for j in range(len(res)):
                if j == len(strs[i]):
                    res = res[0: j]
                    break
                if res[j] != strs[i][j]:
                    if j == 0:
                        return ""
                    res = res[0: j]
                    break
        return res

算法通关手册(LeetCode) | 算法通关手册(LeetCode)

原文内容在这里,如有侵权,请联系我删除。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI算法的调优流程

AI算法的调优是提高模型性能和效率的关键步骤之一。以上流程是一个通用的AI算法调优流程&#xff0c;具体应用时可能需要根据问题类型、数据特征和业务需求进行调整和扩展。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 确定性能…

回归预测 | Matlab实现RIME-BP霜冰算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现RIME-BP霜冰算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现RIME-BP霜冰算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现RIME-BP霜冰算法优化BP神经网络多变量回归预测&#xff08;完整…

2024第二届化学工程、材料与能源科学国际会议(ICCEMES2024)

2024第二届化学工程、材料与能源科学国际会议(ICCEMES2024) 一、【会议简介】 2024第二届化学工程、材料与能源科学国际会议(ICCEMES2024)将于2024年在美丽的三亚市举行。本次会议旨在汇聚全球化学工程、材料与能源科学领域的专家学者&#xff0c;共同探讨和交流相关领域的最…

第二篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas金融数据分析

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas 在金融数据分析中的常见用途和功能介绍二、金融数据清洗和准备示例代码三、金融数据索引和选择示例代码四、金融数据时间序列分析示例代码五、金融数据可视化示例代码六、金融数…

易语言源代码5000例

仅供学习研究交流使用 加群下载

MySQL8安装切换密码验证方式

一、MySQL8中新增了一种密码验证方式&#xff1a;caching_sha2_password&#xff0c;如果安装时选择了如下方式&#xff1a; 则数据库使用新的caching_sha2_password密码验证方式。 二、如果安装时选择了caching_sha2_password验证方式&#xff0c;而安装后想发回传统的mysql_…

医学大数据|统计基础|医学统计学(笔记):开学说明与目录

开始学习统计基础&#xff0c;参考教材&#xff1a;医学统计学第五版 点点关注一切来学习吧 责任编辑&#xff1a;医学大数据刘刘老师&#xff1a;头部医疗大数据公司医学科学部研究员 邮箱&#xff1a;897282268qq.com 久菜盒子工作室 我们是&#xff1a;985硕博/美国全奖…

【EI会议征稿通知】第四届能源工程、新能源材料与器件国际学术会议(NEMD 2024)

第四届能源工程、新能源材料与器件国际学术会议&#xff08;NEMD 2024&#xff09; 2024 4th International Academic Conference on Energy Engineering, new energy materials and devices 第四届能源工程、新能源材料与器件国际学术会议&#xff08;NEMD 2024&#xff09…

免费在线Axure终于找到了,赶紧试试!

Axure作为一种功能强大的原型设计工具&#xff0c;一直受到设计师的青睐。然而&#xff0c;其高昂的价格可能成为一个门槛&#xff0c;限制了一些设计师的选择。但别担心&#xff0c;现在有一个免费的Axure在线工具即时设计&#xff0c;功能更齐全&#xff0c;性价比更高&#…

用BIO实现tomcat

一、前言 本课程的难度较高&#xff0c;需要将Servlet原理和IO课程全部学完。 二、当前项目使用方式 (1).自定义servlet 自定义servlet需要实现WebServlet并且实现name和urlMapping 重启进行访问 http://localhost:8090/myServlet (2).自定义html 重启进行访问 http://loc…

幂等性设计

目录 前言 幂等性设计 幂等性设计处理流程 HTTP 幂等性 消息队列幂等性 基于kafka 前言 幂等性设计&#xff0c;就是说&#xff0c;一次和多次请求某一个资源应该具有同样的副作用。为什么我们要有幂等性操作&#xff1f;说白了&#xff0c;就两点&#xff1a;1、网络的…

Vue-03

Vue指令 v-bind 作用&#xff1a;动态设置html的标签属性&#xff08;src url title…&#xff09; 语法&#xff1a;v-bind:属性名"表达式" 举例代码如下&#xff1a; 实现效果如下&#xff1a; 案例&#xff1a;图片切换 实现代码如下&#xff1a; 实现的效果…

072:vue+cesium 实现下雪效果

第072个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中实现下雪效果,这里使用着色器来实现实例特效。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共120行)着色代码实现心得:专栏目标示例效果

基于springboot+vue的健身房管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

JavaScript基础1之变量的var、const、let和数据类型的原始类型、对象类型、内存空间、拷贝

JavaScript基础 变量var关键字var声明的作用域var 定义多个变量变量提升 let关键字暂时性死区let不是Windows的属性 const关键字 数据类型原始类型对象类型内存空间拷贝拷贝原始类型拷贝引用数据类型比较 变量 ECMAScript变量&#xff1a;松散类型的 >变量可以保存任何类型…

EdgeX Foundry 安装部署

文章目录 一、概述1.官方文档2.Docker Compose 生成器3.创建 docker-compose 文件 二、安装准备1. 克隆服务器2.安装 Docker3.安装 docker-compose 三、非安全模式部署1.docker-comepse2.启动 EdgeX Foundry3.访问 UI3.1. consul3.2. EdgeX Console EdgeX Foundry # EdgeX Fou…

AI:144-通过机器学习预测股票市场趋势

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

IO 与 NIO

优质博文&#xff1a;IT-BLOG-CN 一、阻塞IO / 非阻塞NIO 阻塞IO&#xff1a;当一条线程执行read()或者write()方法时&#xff0c;这条线程会一直阻塞直到读取到了一些数据或者要写出去的数据已经全部写出&#xff0c;在这期间这条线程不能做任何其他的事情。 非阻塞NIO&…

大数据技术(一)

大数据技术概述 大数据技术层面及其功能 数据采集与预处理 利用ETL(extract-transform-load)工具将分布的、异构数据源中的数据&#xff0c;如关系数据、平面数据文件等&#xff0c;抽取到临时中间层后进行清洗、转换、集成&#xff0c;最后加载到数据仓库或数据集市中&…

单例模式及应用场景

如果希望自己的代码更优雅、可维护性更高以及更简洁&#xff0c;往往离不开设计模式这一解决方案。 在JS设计模式中&#xff0c;最核心的思想&#xff1a;封装变化&#xff08;将变与不变分离&#xff0c;确保变化的部分灵活&#xff0c;不变的部分稳定&#xff09;。 那么来…