美文网首页
数据结构(四)串

数据结构(四)串

作者: AdRainty | 来源:发表于2021-08-22 00:48 被阅读0次

4.1 串的定义

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


串.png

S = "a_1a_2\cdots a_n" (n \ge 0)

  • 字串:串中任意个来纳许的字符组成的子序列
  • 主串:包含子串的串
  • 字串在字符中的位置:字符在串中的序号
  • 字串在主串中的位置:字串第一个字符在主串中的位置

1、字串的任意个,即n可以为0
2、字符串的位序从1开始而不是从0开始
3、空格也算一个字符

4.2 串的基本操作

StrAssign(&T, chars) 赋值,把串T赋值为chars
StrCopy(&T,S) 复制,由串S复制得串T
StrEmpty(S) 判空
StrLength(S) 求串长,即S的元素个数
ClearString(&S) 清空,将S清为空串
DestotyString(&S) 销毁串,将S销毁,回收存储空间
Concat(&T, s1, s2) 串连接,用T返回s1和s2连接的字符串
SubString(&Sub, S, pos, len)求字串,用Sub返回串S第pos个字符起长度为len的字串
Index(S,T)定位,若S中存在T相同字串,返回第一次出现的位置,否则返回0
StrCompare(S,T), 比较,若S>T返回>0,若S<T,返回<0

4.3 串的存储结构

4.3.1 顺序存储

4.3.1.1 初始化

typedef struct {
    char ch[MaxSize];
    int length;// 串实际长度
}SString;

4.3.1.2 求字串

bool SubString(SString S, SString * sub, int pos, int len)
{
    // 首先判断子串是否包含在当前字符串内
    if (pos + len  -1 > S.length) return false;
    for (int i = pos; i < pos+len; i++)
    {
        sub.ch[sub.pos+1] = S.ch[i];
    }
    sub.length = len;
    return true;
}

4.3.1.3 比较

int StrCompare(SString S, SString T)
{
    for (int i = 1; i<=S.length && i <=T.length; i++) 
            if (S.ch[i] != T.ch[i]) return (S.ch[i] - T.ch[i])
    return S.length - T.length;
}

4.3.1.4 定位

int Index(SString S, SString T)
{
    int i = 1; n = StrLength(S), m =StrLength(T)
    SString sub;
    while (i < n-m+1)
    {
        SubString(S, &sub, i, m);
        if (StrComp(T, sub) != 0) i++;
        else return i;
    }
    return 0;
}

4.3.2 堆分配存储结构

typedef struct{
        char *ch;
        int length;
} HString;

HString S;
S.ch = (Char *) malloc (Maxlen * sizeof(char));
S.length = 0;

4.3.3 块链存储

typedef struct StringNode{
        char ch[4];
        struct StringNode *next;
}StringNode,  *String;

4.4 串的模式匹配

子串是主串的一部分,一定存在,模式串不一定能在主串中找到

4.4.1 朴素模式匹配算法

int Index(SString S, SString T)
{
    // 定义两个指针分别指向主串和模式串,主要通过改变两个指针而不需要去进行串操作
    int i = 1,j = 1;
    while (i < S.length && j < T.length) {
        if (S.ch[i] == T.ch[j]) {
            i++;
            j++;
        }
        else {
            i = i - j + 2;
            j = 1;
        }
    }
    if (j == T.length) return i - T.length + 1;
    else return 0;
}

最多对比n-m+1次
时间复杂度为O(nm)

4.4.2 KMP算法

void Index_KMP(SString S, SString T, int pos){
    // i 目标串指针,j 模式串指针
    i = pos; j = 1;
    while( i <= length(S) && j <= length(T)){
        // 如果将要和 目标串元素 匹配的元素是模式串首元素前一位的元素
        // 当前目标串元素 和 模式串元素可以匹配
        // if (j == first_indexof(T) - 1 || S[i] == T[j]){
        if(j == 0 || S[i] == T[j]){
            // 指针各自右移一位,这也是为什么j==0时需要放在一起判断的原因
            ++i;
            ++j;
        }else{
            // 发生了失配,查Next数组移动模式串指针
            j = next[j];
        }
    }
    if (j > length(T)){
        // 如果模式串指针溢出了(模式串指针匹配完毕了所有模式串中的元素)
        return i - length(T);
    }
    else return 0;
}

KMP算法主要掌握手算next数组的方法,其中next[1]=0,next[2]=1

相关文章

  • 数据结构(四)串

    4.1 串的定义 字符串简称串,是一种由零个或多个字符多个字符组成的有限序列 字串:串中任意个来纳许的字符组成的子...

  • redis02--数据结构

    常用命令 String:字符串 list/set/hash/zset 这四种数据结构是容器型数据结构,它们共享下面...

  • 面试题2

    四、数据结构和算法 1、求一串数字序列中的连续子串最大和,比如arr=1 -2 3 -1 2,连续子串最大和就是3...

  • 第二章:API 的理解和使用-字符串

    2.2 字符串 字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型...

  • Redis数据结构与对象编码 (Object Encoding)

    数据结构实现 相信大家对 redis 的数据结构都比较熟悉: string:字符串(可以表示字符串、整数、位图) ...

  • Redis学习笔记:String内部编码及其应用场景

    一、概述 字符串类型是Redis最基础的数据结构,Redis中的键都是字符串类型,其他几种数据结构都是在字符串基础...

  • Redis设计与实现读书笔记

    数据结构部分 字符串(SDS) 数据结构为如下: 优点: 可以以常数复杂度获取字符串的长度,因为记录了字符串的长度...

  • Redis学习笔记【04】 - 字符串

    一、简介 字符串类型是redis最基础的数据结构。首先键都是字符串类型,而其它几种数据结构类型都是在字符串类型基础...

  • Python数据结构——字符串、列表、元组、字典

    最近在自学Python,遇到了一些数据结构方面的问题,熟悉使用字符串、列表、元组、字典这四种数据结构对理解Pyth...

  • Redis | Redis 字符串相关命令

    Redis 支持多种数据结构,比如 字符串、列表、集合、有序集合 和 哈希 等数据结构。本次我整理了关于 字符串 ...

网友评论

      本文标题:数据结构(四)串

      本文链接:https://www.haomeiwen.com/subject/vfrebltx.html