重点简要:
1、串(又叫字符串)中的字符数目n称为串的长度,零个字符的串称为空串。
2、串的比较:
s=“hap “,t=” happy “,s<t。
s=”happen”,t=”happy”,s<t。
3、串的顺序存储结构,以\0作为串值的终结。
4、朴素的模式匹配算法:子串的定位操作通常称做串的模式匹配。
5、主串S和子串T的长度存在S[0]和T[0]中。
6、KMP模式匹配算法中next数组
|---- 0 (当j =1时)
Next[ j ]= | Max { k|1<k<j ,且‘p1…pk-1’=’pj-k+1…pj-1}此集合不为空。
|---- 1 (其他情况)
7、next数组的推导
J | 123456 |
模式串T | abcabx |
Next [ j ] | 011123 |
注意:J由1到j-1的串
8、前后缀一个字符相等,k=2,两个字符相等k=3,n个相等k=n+1。
9、计算出当前要匹配的串T的next数组(KMP模式匹配算法实现)
void get_next(String T,int *next)
{
int i,j;
i=1;
j=0;
next [1]=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
++i;
++j;
Next[ i ]=j;
}
else
j=next[j];
}
}
10、nextval版(KMP模式匹配算法改进)
J | 123456789 |
模式串T | Ababaaaba |
Next[j] | 011234223 |
Nextval[j] | 010104210 |
代码:
void get_next(String T,int *nextval)
{
int i,j;
i=1;
j=0;
nextval[1]=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
++i;
++j;
if(T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
Next[ i ]=j;
}
else
j=nextval[j];
}
}