【数据结构】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 ;
}

相关文章

【啊哈!算法】算法3:最常用的排序——快速排序       ...
匿名组 这里可能用到几个不同的分组构造。通过括号内围绕的正...
选择排序:从数组的起始位置处开始,把第一个元素与数组中其...
public struct Pqitem { public int priority; ...
在编写正则表达式的时候,经常会向要向正则表达式添加数量型...
来自:http://blog.csdn.net/morewindows/article/details/6...