【数据结构】4.串

来源:互联网 发布:jdbc连接数据库5个步骤 编辑:程序博客网 时间:2024/06/05 20:20

【串的定义】
一、定义
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,string T,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 ;}
原创粉丝点击