数据结构——串

串是一种数据元素为字符的特殊的线性表。

1. 串的定义

零个或多个字符(字母、数字或其他字符)组成的有限序列。记为 S="a1a2...an"S="a1​a2​...an​",长度为 nn,空串长度为0。

2.串的术语

  • 串长度:串中字符的个数。
  • 空串:零个字符的串。即:"",通常用φ表示。
  • 字符位置:字符在序列中的序号。
  • 空格串:由一个或多个空格组成的串。
  • 子串:串中任意个连续的字符组成的子序列。
  • 主串:包含子串的串。
  • 子串位置:子串的第一个字符在主串中的位置。
  • 串相等:两个串的值相等,即两个串的长度相等,各个对应位置的字符都相等。

3.串的基本运算

  • strassign (s, chars) //串赋值
  • strCompare (S,T) //串比较
  • strLength(S) //求串长
  • concat(T, S1, S2) //串联接
  • subString(S, sub, pos, len) //求子串
  • strCopy(T, S) //串拷贝
  • strEmpty(S) //串判空
  • clearString (S) //清空串
  • index(S, T, pos) //子串的位置
  • replace(S, T, V) //串替换
  • strInsert(S, pos, T) //子串插入
  • strDelete(S, pos, len) //子串删除

4. 串的存储结构

  • 顺序存储 :使用数组存储字符,末尾可加结束符(如C的\0)。优点:随机访问高效;缺点:插入/删除需移动元素。

  • 链式存储:每个节点存储一个或多个字符,通过指针链接。优点:动态扩展方便;缺点:空间利用率低,操作复杂。

5. 模式匹配算法

(1)暴力匹配(Brute-Force)

  • 过程 :主串指针i和模式串指针j逐个比较,失败时i回溯到i-j+1j重置为0。

  • 时间复杂度:O(mn)O(mn)。

(2)KMP算法

  • 核心思想:利用部分匹配信息(最长公共前后缀),避免主串回溯。

  • 步骤

构造next数组:记录模式串每个位置的最长公共前后缀长度。

匹配过程 :主串指针i不回溯,模式串指针j根据next数组跳转。

  • next数组构造

    复制代码
    void  getnext( SqString T, int next[ ] )
    {      int j,  k;
            next[0] = -1; 
            j = 0;   k = -1;      //k=next[j]
           while( j < T.length-1 )
           {      if ( k == -1 || T.str[j] == T.str[k] )  
                  {     next[j+1] =  k+1;
                         j++;
                         k++;    //k=next[j]
                  } 
                  else    k = next[k]
           }       
    }
  • 时间复杂度:O(m+n)O(m+n),适用于频繁匹配的场景。

6. 代码示例(KMP算法实现)

复制代码
int  Index_KMP( SqString S, SqString T )
{      int i, j, next[200];
       getnext(T, next);
       i=0; j=0;
       while( i<S.length && j<T. length )
       {     if( j == -1|| S.str[i] ==T.str[j] )
              {    i++; j++; 
              }
              else  j = next[j];
       }
       if(j>=T.length)  return i-T.curlen+1; //返回位序  
       else return 0;
}

总结

串是数据处理的基础结构,其高效操作依赖于合理的存储设计和算法选择。掌握KMP算法及其next数组的构造是解决复杂字符串匹配问题的关键。实际应用中需结合场景权衡不同方法的优缺点。

相关推荐
不学无术の码农6 分钟前
《Effective Python》第1章 Pythonic 思维总结——编写优雅、高效的 Python 代码
开发语言·python
zhou1857 分钟前
MySQL保姆级安装教程(附资源包+5分钟极速配置+环境变量调试技巧)
java·python·mysql·php
码视野9 分钟前
基于物联网的智能家居监控系统设计和实现(源码+论文+部署讲解等)
物联网·智能家居
o0向阳而生0o19 分钟前
42、在.NET 中能够将⾮静态的⽅法覆写成静态⽅法吗?
c#·.net
lczdyx32 分钟前
PNG转ico图标(支持圆角矩形/方形+透明背景)Python脚本 - 随笔
图像处理·python
GUIQU.38 分钟前
【每日一题 | 2025年5.5 ~ 5.11】搜索相关题
算法·每日一题·坚持
双叶83638 分钟前
(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)
c语言·开发语言·数据结构·c++
不知名小菜鸡.39 分钟前
记录算法笔记(2025.5.13)二叉树的最大深度
笔记·算法
lgily-12251 小时前
常用的设计模式详解
java·后端·python·设计模式
TDengine (老段)1 小时前
TDengine 在金融领域的应用
大数据·数据库·物联网·金融·时序数据库·tdengine·涛思数据