数据结构(一)字符串和模式匹配算法

本文介绍了字符串的基本概念和三种常见的存储表示方法。重点讲解了字符串的模式匹配,包括BF(Brute-Force)算法和KMP(Knuth-Morris-Pratt)算法的原理、代码实现、动图展示以及复杂度分析。BF算法时间复杂度为O((n-m)*m),而KMP算法优化了匹配过程,时间复杂度降为O(m+n)。
摘要由CSDN通过智能技术生成

前言

计算机中的非数值处理的对象基本上是字符串数据,随着语言加工程序的发展,字符串作为一种变量类型出现在越来越多的程序设计语言中,同时也产生了一系列的字符串操作。在日常的程序设计中,如名称、地点等信息都是以字符串形式表示的,又如文本框、输入框等都是以字符串数据作为处理对象。

什么是字符串

字符串(string),或者直接叫作串,是由零个或多个字符组成的有限序列

串中字符的个数称为串的长度,当字符个数为0时,此时串被称为空串

由一个或多个空格组成的串称为空格串,需要注意的是空串不等于空格串,虽然它们看起来都没有内容。

String str1 = "Jack";
String str2 = "123@qq.com";
String str3 = "";		// 空串
String str4 = " ";		// 空格串(一个空格)

串中任意个(包含0个)连续的字符组成的子序列称为该串的子串,包含子串的串称为主串,子串第一个字符在主串中的位置表示该子串在主串中的位置。

String str1 = "helloworld!";
String str2 = "ll";		//	str2 是 str1 的子串,它在 str1 中的位置为 2

当两个串的值相等时,称两个字符串相等

String str1 = "WuHan";
String str2 = "WuHan";	// str1 与 str2 相等

字符串的表示和实现

字符串有时不仅仅是一个表示特定信息的常量,它有时候也以变量的形式出现。字符串通常有三种机内表示方法。

定长顺序存储表示

类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值额字符序列。

堆分配存储表示

以一组地址连续的存储单元存放串值字符序列,但存储空间是在程序执行过程中动态分配的。

块链存储表示

和线性表的链式存储结构相类似,采用链表方式存储串值。

串的模式匹配

模式匹配是数据结构中字符串的一种基本运算,是各种串处理系统中的最重要的操作之一。

设 S 是给定的主串,T 是给定的子串,在主串 S 中查找等于子串 T 的串的过程就是模式匹配的过程,T 称为模式串。如果在 S 中找到 T 子串,则称匹配成功,函数返回 T 在 S 中首次出现的存储位置,否则匹配失败,返回-1。

字符串匹配算法有很多,这里只介绍两种最常见的算法。

BF(Brute-Force)算法
原理

最朴素的想法就是枚举主串的每一个字符,以每一个字符为起始点,与模式串的第一个字符开始尝试匹配,如果相同继续匹配主串和模式串的下一个字符,如果不同,从主串下一个字符再次开始匹配。

如果在一次匹配过程中匹配到模式串的最后一个字符,则匹配成功,否则失败。

代码实现
public int myBFIndexOf(String S, String T) {
   
    int n = S.length(), m = T.length();
    // pos 为本轮匹配主串的起始字符位置,不能大于主串长度减模式串长度的差
    // 因为当 pos > n - m 时,一定会匹配失败
    for(int pos = 0; pos <= n - m
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值