热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

五、数据结构笔记:串[一](定义朴素的模式匹配算法)

串的定义:是由零个或多个字符组成的有限序列,又叫字符串。一般记为s“a1a2a3an(n0),其中,s是字符串的名

串的定义:是由零个或多个字符组成的有限序列,又叫字符串。

 

一般记为 s=“a1a2a3...an"(n>=0),其中,s是字符串的名称,用双引号括起来的字符序列是串的值,注意引号不属于串的内容。ai可以是字母、数字或者其他字符,i是该字符在串中的位置。串中的字符数目n称为串的长度,定义中谈到的有限是指长度n是一个有限的数值。零个字符的串称为空串,它的长度为0,可以直接用两个双引号表示,所谓序列,说明串的相邻字符之间具有前驱和后继的关系。

还有一些概念需要注意:

  • 空格串,是只包含空格的串,注意它与空串的区别,空格串是有内容有长度的,而且枯眼不止一个空格。
  • 子串与主串,串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。
  • 子串在主串中的位置就是该子串的第一个字符在主串中的位置。

串的比较

两个数字进行比较,2比1大,这完全正确,可是两个字符串如何比较呢?

事实上,串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号。

计算机中的常用字符是用标准的ASCII编码,更准确一点,由8位二进制数表示一个字符,一共可以表示256字符,这些只够以英文为主的语言和特殊符号,但全世界文字千千万万,显然这是不够用的,于是提出了Unicode编码,采用16位的二进制数表示一个字符,一共可以表示6.5万多个,而前256个字符与ASCII完全一致。

如果我们在C语言中比较两个串是否相等,必须是他们串的长度以及他们各个对应位置的字符都相等,才算是相等。

那么当两个字符串不想等时,如何比较他们的大小呢?

给定两个串:s=“a1a2a3...an”,t=“b1b2b3...bm”,当满足以下条件之一时s

  1. n
  2. 存在某个k <&#61; min(m,n)&#xff0c;使得ai&#61;bi&#xff0c;(i从1到k-1)&#xff0c;ak

换句话说&#xff0c;当两个字符串相等&#xff0c;对应位置的字符也都相等&#xff0c;则两个串是相等的。

串的存储结构

1、顺序存储结构

串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的。按照预定义的大小&#xff0c;为每个定义的串变量分配一个固定长度的存储区。一般是用定常数组来定义。

既然是定长数组&#xff0c;就存在一个预定义的最大串长度&#xff0c;一般可以将实际的串长度值保存在数组的0下标位置&#xff0c;有的语言加在数组最后&#xff1a;

 

 

 

上面说的串的顺序存储其实是有问题的&#xff0c;因为字符串的操作&#xff0c;比如两个串的连接&#xff0c;新串的插入等&#xff0c;都有可能造成串长度超过数组长度。

于是对于顺序存储&#xff0c;有一些优化&#xff0c;串值的存储空间可在程序执行过程中动态分配而得。

2、链式存储结构

对于串的链式存储结构&#xff0c;与线性表是相似的&#xff0c;但由于传结构的特殊性&#xff0c;结构中的每个元素数据是一个字符&#xff0c;如果也简单的应用链表存储串值&#xff0c;一个结点对应一个字符&#xff0c;就存在很大的内存浪费。因此一个结点可以存放一个字符&#xff0c;也可以考虑存放多个字符&#xff0c;最后一个结点若是未被占满&#xff0c;可以用井号或其他值将其填满。

 

 

 

总的来说&#xff0c;不如顺序存储灵活&#xff0c;性能也不如顺序存储结构好。

朴素的模式匹配算法

子串的定位操作&#xff0c;通常称作串的模式匹配

通常的模式匹配&#xff0c;是对主串的每一个字符作为子串的开头&#xff0c;与要匹配的字符串进行匹配&#xff0c;不匹配则整体后移一位&#xff0c;直到完全匹配。

其时间复杂度为O(n&#43;m)&#xff0c;n是主串的长度&#xff0c;m是子串的长度。

 

示例&#xff1a;

主串&#xff1a; “goodgoogle”找到   “google” 这个子串的位置

 

后续会有 KMP算法的实现&#xff0c;因为比较复杂&#xff0c;单独拿出一个章节进行讲解。。。。

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


推荐阅读
  • 本文探讨了数据结构与算法之间的关系,从基本概念入手,逐步解析二者如何相辅相成,共同构建高效的计算机程序。文中结合实际案例,对数据结构和算法进行了详细说明,并提出了一些思考问题。 ... [详细]
  • ipsec 加密流程(二):ipsec初始化操作
    《openswan》专栏系列文章主要是记录openswan源码学习过程中的笔记。Author:叨陪鲤Email:vip_13031075266163.comDate:2020.1 ... [详细]
  • C语言是计算机科学和编程领域的基石,许多初学者在学习过程中会感到困惑。本文将详细介绍C语言的基本概念、关键语法和实用示例,帮助你快速上手C语言。 ... [详细]
  • LeetCode 312. 戳气球 【动态规划】【Java】【困难】
    本文将详细介绍 LeetCode 312. 戳气球 问题的背景、解题思路及实现方法,包括题目描述、解题策略、代码实现及解题过程。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇
    数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • 在C语言中,指针的高级应用及其实例分析具有重要意义。通过使用 `&` 符号可以获取变量的内存地址,而 `*` 符号则用于定义指针变量。例如,`int *p;` 定义了一个指向整型的指针变量 `p`。其中,`p` 代表指针变量本身,而 `*p` 则表示指针所指向的内存地址中的内容。此外,指针在不同函数中可以具有相同的变量名,但其作用域和生命周期会有所不同。指针的灵活运用能够有效提升程序的效率和可维护性。 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • 【线段树】  本质是二叉树,每个节点表示一个区间[L,R],设m(R-L+1)2(该处结果向下取整)左孩子区间为[L,m],右孩子区间为[m ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • C语言编写线程池的简单实现方法
    2019独角兽企业重金招聘Python工程师标准好文章,一起分享——有时我们会需要大量线程来处理一些相互独立的任务,为了避免频繁的申请释放线程所带 ... [详细]
  • 结城浩(1963年7月出生),日本资深程序员和技术作家,居住在东京武藏野市。他开发了著名的YukiWiki软件,并在杂志上发表了大量程序入门文章和技术翻译作品。结城浩著有30多本关于编程和数学的书籍,其中许多被翻译成英文和韩文。 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常采用RC滤波电路,而在由工业控制计算机组成的自动 ... [详细]
author-avatar
用户0a8xoj91q0
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有