串的概念
(string)由零个或多个字符串组成的有序序列,又名叫字符串
- 串中字符数目n称为串的长度
- 零个字符的串称为空串
字符的表示
- 计算机中常用的字符是由ASCII编码
- 开始是由7位二进制数表示一个字符,总共可表示128个字符
- 后来由于特殊符号的出现,扩展了ASCII码,由8位二进制数表示一个字符,可以表示256个字符
- 后来又有了Unicode码,比较常用的是16位二进制数表示一个字符,可以表示约6.5万多个字符
- 为了和ASCII码兼容,Unicode码的前256个和ASCII码一样
字符串的比较
给定俩个串,s(长度n),t(长度m),满足n<m且ai=bi时s<t
存在某个k<=min(m,n) 使得ai=bi ak<bk 所以s<t
index朴素的模式匹配算法
String s;
String T;
String sub;
int n,m,i;
n=StrLength(S);
m=StrLength(T); //求字符串长度
while(i<=n-m+1){
SubString(sub,S,i,m); //取子串
if(StrCompare(sub,T)!=0); //比较
++i;
else
return i;
}
KMP模式匹配算法
大大避免重复遍历的情况
原理
j | 123465 |
模式串T | abcabx |
next[j] | 011123 |
如果前后缀一个字符相等,k=2,n个相等,k=n+1
通过计算返回子串的next数组
void get_next(string T,int *next){
int i,j;
i=1;j=1;
next[1]=0;
while(i<T[0]){
if(j==0||T[i]==T[j]){
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
计算出当前要匹配的串T的next数组
int Index_KMP(string s,string T,int pos){
int i=pos; //主串s当前位置下标
int j=1;
int next[255];
get_next(T,next);
while(i<S[0]&&j<=T[10]){
if(j==0||s[i]==T[j]){
++i;
++j;
}
else{
j=next[j];
}
}
if(j>T[10]){
return i-T[0];
}
else
return 0;
}