一、 串
1、串是由0个或者多个字符构成的有限序列
2、字典序:定义字符串的大小也称为字典序。
(1)若两个串长度为m,n。m>n,则m串大于n串
(2)若m=n,当两串,第一个不同的字符,哪个大的哪个串就大
二、 串的存储
1、顺序存储
定长存储串,放在数组中进行操作。当溢出了后会自动截断
2、堆分配存储表示:动态存储字符串
以一组地址连续的存储单元存放串值字符序列,但空间是程序执行中动态分配的。具体操作为:如将串S复制给T。若T已经存在,则先释放T。
Slen=S.length()l
T = new char(Slen+1);
Strcop(S,T);
3、链表存储
与线性表的链式存储差不多,但是如果每个节点只存一个字符的话有点浪费空间。所以一般一个节点多个字符+指向后面的指针。最后一个节点如果没有填满就加特殊符号,如#。链式存储对串的操作,如连接是比较方便,但是总的来说没有堆操作灵活。
一般使用堆操作
三、 模式匹配
模式识别是在目标串中寻找第一个出现模式串的位置
1、简单算法:就是挨着比较,效率很低
2、KMP算法:效率最高
KMP的方法的核心是减少模式串需要匹配的长度。
确定K的位置:
Next(j)=- -1(j=0);
=k (找到了第一个整数)
=0 (其他情况)
代码如下:
#include
#include
char Tstring[20];
char Pstring[20];
int next[20];
void allnext()
{
next[0]=-1;
int i=0,j=-1;
while(i
{
if(Pstring[i]==Pstring[j]||j==-1)
{
i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
int KMP(char P)
{
int i=0,j=0;
int P1=strlen(Pstring);
int T1=strlen(Tstring);
while(i
{
if(j==-1)
{
i++;
j=0;
}
else if(Pstring[j]==Tstring[i])
{
++i;
++j;
}
else
{
j=next[j];
}
}
if(j
{
return -1;
}
else
{
return i-P1;
}
}
int main()
{
scanf("%s",Tstring);
scanf("%s",Pstring);
allnext();
int i;
for(i=0;i
{
printf("%d ",next[i]);
}
printf("\n");
int v=KMP(Pstring);
printf("第一次出现的地方: %d\n",v);
system("PAUSE");
}