利用位图bitmap删除字符串中重复的字母

思想:每个二进制位代表一个字母是否出现。共有8个int类型,即8*4*8=256个二进制位。
      每次置位需要定位某二进制位属于哪个int位:bitmap[c/32] ,然后确定在int中的偏移1 << (c % 32)
需要仔细理解,可单步调试理解之。
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
	int i;
	char *source = "aaabbccdabgf";  //A 65  a 97
	
	char *dest;
	char *temp;
	
	unsigned int bitmap[8] = {0,0,0,0,0,0,0,0};
	unsigned char c;
	unsigned int mask;
	
	dest = (char*)malloc(strlen(source));
	temp = dest;
	
	printf("Before %s\n", source); 
	i=0;
	while(source[i])
	{
		c = source[i];
		mask = 1 << (c % 32); //mask = 1<<1);
		if ((bitmap[c/32] & mask) == 0)   //   bitmap[c/32=3] & 2
		{
			*temp++ = source[i];
			bitmap[c/32] |= mask;
		}
		i++;
	}
	*temp = '\0'; 
    
	printf("After %s\n", dest);


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值