【数据结构】4.串

前端之家收集整理的这篇文章主要介绍了【数据结构】4.串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

【串的定义】
一、定义
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 ;
}
原文链接:https://www.f2er.com/datastructure/382278.html

猜你在找的数据结构相关文章