【串的定义】
一、定义
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 ;
}