首页 > 编程语言 >05 串 | 数据结构与算法

05 串 | 数据结构与算法

时间:2022-10-17 19:44:05浏览次数:45  
标签:字符 string nextval index 05 next 算法 str 数据结构

1. 串

1. 串的定义

  1. 串:零个或多个 字符 组成的 有限 序列
  2. 串的长度:串中字符的个数
  3. 空串:长度为 0 的串 ""
  4. 非空串:String = "c1c2c3...cn"
    1. 串名:String
    2. 定界符:" "
    3. 数据元素:字符 ci
  5. 主串:包含子串的串
  6. 子串:串中任意个 连续 的字符组成的子序列
  7. 子串的位置:子串中的第一个字符在主串中的序号
  8. 串相同:串长度相同并且各个对应的字符也相同

2. 串的存储设计

  1. 顺序串:采用连续设计存储的字符序列
    1. 存储形式

      1. 非压缩形式image

      2. 压缩形式 image

    2. 如何表示串的长度

      1. 用一个变量记录实际长度
      2. 在串尾增加一个不会在串中出现的特殊字符作为终止符,例如 '\0'
  2. 链接串:采用链接存储设计来存储串。串的链式存储结构和线性表的串的链式存储结构类似,采用单链表来存储串,结点的构成是:
    1. data域:存放字符,data域可存放的字符个数称为结点的大小;
    2. next域:存放指向下一结点的指针。
      若每个结点仅存放一个字符,则结点的指针域就非常多,造成系统空间浪费,为节省存储空间,考虑串结构的特殊性,使每个结点存放若干个字符,这种结构称为块链结构。

2. 串的模式匹配 / \(KMP\) 算法

1. 串的匹配

  1. 目标串:主串
  2. 模式串:子串
  3. 匹配:在目标串当中找到子串的位置

2. \(KMP\) 算法

  1. 算法出发点:利用前面已经匹配的结果,进行 无回溯 的匹配

  2. next[] 表示将模式串向右滑动尽可能远的一段距离

  3. next[]的本质:找到模式串中 最长的相同前缀和后缀

  4. 算法:

    1. 计算 next[] 数组
    /*
     *next的定义
     * next[j] = -1, when j = 0;
     * next[j] = max{相同的前缀与后缀的长度}
     * next[j] = 0, otherwise(即没有匹配到)
     */
    void build_next(vector<int>& next, string str){
        next[0] = -1;
        int i = 0 , j = -1;     //j = -1,i and j both ++;
        while(i < str.length() - 1){
            if(j == -1 || str[i] == str[j]) {
                next[++i] = ++j;
            }
            else j = next[j];   //can not match, j goes back
        }
    }
    
    1. 匹配
    int strStr(string target_string, string pattern_string) {
        int n = target_string.length();
        int m = pattern_string.length();
        int i = 0 , j = 0;
        vector<int> next(m);
        build_next(next , pattern_string);  //get next[]
        while(i < n && j < m){
            if(j == -1 || target_string[i] == pattern_string[j]){
                ++i ,++j;
            }
            else j = next[j];
        }
        if(j == m) return i - j;    //j == m, 匹配成功
        else return -1;     // fail to match
    }
    
  5. 改进的 \(KMP\) 算法

    1. 对于下面这种情况:有多个相同的连续字符,显然如果匹配不成功可以直接跳过这一大段连续的相同字符,因此对于新的 nextval[],我们有
      1. 如果当前模式串位置的字符和目标串位置的字符 不相同,那么 nextval[index] = next[index]
      2. 如果当前模式串位置的字符和目标串位置的字符 相同,那么 nextval[index] = nextval[next[index]]
    2. 例子
    index 0 1 2 3 4 5 6 7 8 9 10 11 12
    pattern a a a b b a b c c a a a a
    next -1 0 1 2 0 0 1 0 0 0 1 2 3
    nextval -1 -1 -1 2 0 -1 1 0 0 -1 -1 -1 3
    1. 算法
    void build_nextval(vector<int>& nextval, string str){
        nextval[0] = -1;
        int i = 0 , j = -1;
        while(i < str.length() - 1){
            if(j == -1 || str[i] == str[j]) {
                ++i , ++j;
                /*nextval[index] = next[index]*/
                if(str[i] != str[j]) nextval[i] = j;
                /*nextval[index] = nextval[next[index]]*/
                else nextval[i] = nextval[j];
            }
            else j = nextval[j];
        }
    }
    

标签:字符,string,nextval,index,05,next,算法,str,数据结构
From: https://www.cnblogs.com/RadiumGalaxy/p/16800358.html

相关文章

  • 1105 链表合并(JAVA)
    给定两个单链表L1=a1→a2→⋯→an−1→an和L2=b1→b2→⋯→bm−1→bm。如果n≥2m,你的任务是将比较短的那个链表逆序,然后将之并入比较长的那个链表,得到一个形如a1→a2→......
  • 做题记录整理数据结构/线段树3 P3822 [NOI2017] 整数(2022/10/17)
    P3822[NOI2017]整数为什么这玩意是双tag呢因为他按理来说正解是用线段树来做的,但是有很多题解都是直接上set搞的,所以就两个tag都打上了首先我们可以想到用bitset来表......
  • [数据结构与算法 (Kotlin 语言)] 1.冒泡排序(Bubble Sort)
    算法简介冒泡排序(BubbleSort),是一种计算机科学领域的较简单的排序算法。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮......
  • 【算法的乐趣】
    前言:听到算法的乐趣,大家是不会想起《算法的乐趣》这本书呢?这段时间在研究算法,本篇博客主要作为算法的开篇,来和大家谈谈算法!核心:百度定义:算法(Algorithm)是指解题方案的准确而......
  • 计算机视觉系列案例 | 基于YOLOv3及Sort算法实现目标跟踪
    随着计算机视觉技术的发展,基于视频的目标跟踪算法成为研究热点。目标跟踪技术通常依据视频中目标及背景的信息,对目标的形状、大小、位置、轨迹等运动状态进行预测。目标跟踪......
  • 05.条件查询
    条件查询SQL中常用的运算符=等于,比较是否相等及赋值!=比较不等于>比较大于<比较小于>=比较大于等于<=比较小于等于ISNULL比较为......
  • QFramework v1.0 使用指南 工具篇:12. TableKit 表数据结构
    在设计UIKit、ResKit等系统时,如果只使用默认的List和Dictionary来管理数据和对象需要做很多的封装。因为本身List和Dictionary支持的查询方式比较单一,如果想做......
  • QFramework v1.0 使用指南 工具篇:05. ResKit 资源管理&开发解决方案
    ResKit简介ResKit,是资源管理&快速开发解决方案特性如下:可以使用一个API从dataPath、Resources、StreammingAssetPath、PersistentDataPath、网络等地方加载资......
  • Js回溯算法
    原文链接:https://www.cnblogs.com/yalong/p/16798569.html回溯算法回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条......
  • C/C++数据结构算法动态演示系统
    C/C++数据结构算法动态演示系统《数据结构与算法基础》课程项目课程项目题目:数据结构算法动态演示系统设计要求:设计并建立一套数据结构算法的动态演示系统。利用可......