加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

【数据结构】4.串

发布时间:2020-12-15 06:08:23 所属栏目:安全 来源:网络整理
导读:【串的定义】 一、定义 1. 由多个字符组成的有限序列叫做串 2. 序列中字符的个数称为串的长度 3. 长度为零的串叫做空串 4. 仅由空格符组成的串叫做空格串 5. 串中任意连续序列称为该串的子串,包含子串的序列为主串。 6. 字符在串中的序号称为该字符在串中的

【串的定义】
一、定义
1. 由多个字符组成的有限序列叫做串
2. 序列中字符的个数称为串的长度
3. 长度为零的串叫做空串
4. 仅由空格符组成的串叫做空格串
5. 串中任意连续序列称为该串的子串,包含子串的序列为主串。
6. 字符在串中的序号称为该字符在串中的位置,子串在串中的位置由它的第一个字符位置表示

【串的表示和实现】
一、定长顺序存储
二、堆动态分配存储
三、串的块链存储

【串的模式匹配】
一、常用的匹配算法

int IndexOf(string S,string T,int startIndex)
{
    int i=startIndex,j=0;
    while(i< S.Length && j < T.Length)
    {
        if(S[I] == T[j])
        {
            ++i;
            ++j;
        }else
        {
            i = i - j + 1;
            j=0;
        }
    }
    if(j== T.Length)
        return  i-j;
    return -1;
}

二、KMP的模式匹配算法
1.上面的算法一旦在比较出现不匹配的时候,就回到模式串的起始位置重新进行比较。
实际上根据模式串的字符特点,有些情况是不需要从头开始比较,可以将模串滑动到一定位置开始比较。
2.KMP匹配算法

int IndexOf(string S,int startIndex)
{
    int[] next = GenNext(T);
    int i=startIndex,j=-0;
    while(i< S.Length && j < T.Length)
    {
        if(j == -1 || S[I] == T[j])
        {
            ++i;
            ++j;
        }else
        {
            j = next [j];
        }
    }
    if(j== T.Length)
        return  i-j;
    return -1;
}

3.KMP求:当比较到主串的i位置,模式串的j位置时不匹配,应该将模式串滑动的距离k。

int[] GenNext(string T)
{   
    //-1表示重头开始
    int[] nextArr = new int[T.length]
    int i=0;
    int j=--1;
    nextArr[i]=j;
    while(true)
    {
        if(j == -1 || T[i] == T[j])
        {   
            ++i;
            ++j;
            nextArr[i] = j;
            if(i == T.length -1)
                break;
        }else
        {
            j = nextArr[j];
        }
    }
    return nextArr ;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读