04、串
1、概念:
逻辑结构:
字符串,任意个连续字符组成了子串。
和线性表比较而言:通常只会对子串进行增删改查操作,数据类型为字符
比较操作:对比ASCII编码大小。
2、存储结构
顺序分配:和顺序表类似,只是数据类型为char
typedef struct{
char ch[Max];
int length;
}SString;
typedef struct{
char *ch;
int length;
}HString;
bool InitHString(HString *s){
s->ch = (HString*)malloc(sizeof(HString));
if(s->ch == NULL){
return false;
}
s->length = 0;
return true;
}
求子串
bool SubString(SString *Sub,SString s,int pos,int len){
if((pos + len - 1) > s.length){
return false;
}
int i;
for(i = pos;i < pos+len;i++){
Sub->ch[i - pos + 1] = s[i];
}
Sub->length = len;
return true;
比较操作:
int StrCompare(SString s,SString t){
int i;
for(i = 1;i <= s.length && i <= t.length;i++){
if(s.ch[i] != t.ch[i]){
return s.ch[i] - t.ch[i];
}
}
return s.length - t.length;
}
定位操作:
//定位操作
int Intex(SString s,SString t){
SString sub;
int i = 1,n = s.length,m = t.length;
while(i <= n - m + 1){
SubString(&sub,s,i,m);
if(StrCompare(sub,t)!=0){
i++;
}else{
return i;
}
}
return 0;
}
暴力匹配,从0,n先定位取出子串,然后进行对比。
朴素匹配:
int Index(SString s,SString t){
int i = 1,j = 1;
while(i <= s.length && j <= t.length){
if(s.ch[i] == t.ch[j]){
i++;
j++;
}else{
i = i - j + 2;
j = 1;
}
}
if(j > t.length){
return i - t.length;
}else{
return 0;
}
}
3、KMP算法
思路如果不匹配,将j指针指向next数组
int Index(SString s,SString t,int next[]){
int i = 1,j = 1;
while(i <= s.length && j <= t.length){
if(j == 0 ||s.ch[i] == t.ch[j]){
i++;
j++;
}else{
j = next[j];
}
}
if(j > t.length){
return i - t.length;
}else{
return 0;
}
}
next数组手工建立:只和模式串相关