字符串哈希

参照算法笔记P109,甲级1039


先假设字符串均由大写字母A~Z构成。在这个基础上,不妨把A~Z视为0~25,这样就把26个大写字母对应到了26进制中。接着,按照将26进制转化为10进制的思路,由进制的转换结论可知,在进制转换过程中,得到的10进制肯定是唯一的,由此便可实现将字符串映射为整数的需求(注意:转换成的最大整数位(int)(pow(26,len)-1),len为字符串长度)

int hash(char s[],int len){
	int id=0,i;
	for(i=0;i<len;i++){
		id=id*26+(s[i]-'A');
	}
	return id;
} 


//如果有小写字母,则把a~z作为26~51 

int hash(char s[],int len){
	int id=0,i;
	for(i=0;i<len;i++){
		if(s[i]>='A'&&s[i]<='Z'){
			id=id*52+(s[i]-'A');
		} 
		else if(s[i]>='a'&&s[i]<='z'){
			id=id*52+(s[i]-'a')+26;
		}
	}
	return id;
} 


//如果出现数字,一般有2种方法:
1.按照小写字母的处理方法,增大进制数至62。
2.如果保证在字符串的末尾是确定个数的数字,那么就可以把前面的英文字母的部分按
上面的思路转换成整数,再将末尾的数字直接拼上去。例如对由3个字符加一位数字组成的
字符串"BCD4" ,就可以将前面的"BCD"转换成731,然后直接拼上末位的4变为7314。

int hash(char s[],int len){
	int id=0,i;
	for(i=0;i<len-1;i++){
		id=id*26+(s[i]-'A');
	}
	id=id*10+(s[len-1]-'0');
	return id;
} 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值