04、字符串

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数组手工建立:只和模式串相关

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值