数据结构(串)

串的概念

(string)由零个或多个字符串组成的有序序列,又名叫字符串

  • 串中字符数目n称为串的长度
  • 零个字符的串称为空串

字符的表示

  1. 计算机中常用的字符是由ASCII编码
  2. 开始是由7位二进制数表示一个字符,总共可表示128个字符
  3. 后来由于特殊符号的出现,扩展了ASCII码,由8位二进制数表示一个字符,可以表示256个字符
  4. 后来又有了Unicode码,比较常用的是16位二进制数表示一个字符,可以表示约6.5万多个字符
  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模式匹配算法

大大避免重复遍历的情况

原理

j123465
模式串Tabcabx
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;
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值