[google面试CTCI] 1-1.判断一个字符串是否包含重复字符

【字符串与数组】

Q:Implement an algorithm to determine if a string has all unique characters What if you
can not use additional data structures?

题目:实现一个算法来判断一个字符串是否包含重复字符。如果不能使用额外数据结构,怎么做?

解答:


方法一:从头到尾取字符串中的每一个字符,并将该字符与其后的字符依次比较,一旦发现重复的字符,就返回,表示该字符串含有重复字符串。

int is_unique(char * str){
	int len=strlen(str);
	int  i,j;
	for(i=0;i<len-1;++i){
	  for(j=i+1;j<len;++j){
		if(str[i]==str[j])
		  return 0;
		}
	}
	return 1;
}

方法二:如果假设字符串中的字符都是ascii字符(ascii码字符对应的数值范围为0-255),那么我们可以分配一个256字节大小的数组,并将该数组元素初始化为0。然后,遍历字符串中的字符,将字符对应的ascii码值作为数组下标,如若该数组元素为0,将其置为1;如若该数组元素为1,则说明该字符出现过,说明字符串含有重复字符。

int is_unique(char* str){
	int flags[256];
	int  i;
	memset(flags,0,256);
	for(i=0;i<strlen(str);i++){
  		if(flags[str[i]]==1)
			return 0;
  	flags[str[i]]=1;
	}
	return 1;
}

方法三.由于方法二中用字符数组来表示一个字符(byte)是否出现过,事实上,只需要用一个位(bit)即可表示某个字符是否出现过,可以节约存储空间,因此,我们可以用位操作来改写方法二。

int is_unique_str2(char* str){
	int flags[8];//只需要8个32位的int,8*32=256位
	memset(flags,0,sizeof(flags));
	int i;
	int len=strlen(str);
	for(i=0;i<len;i++){
		int index=(int)str[i]/32;
		int shift=(int)str[i]%32;
		if(flags[index] & (1<<shift))
  			return 0;
	flags[index]|=(1<<shift);
	}
	return 1;
}

作者:Viidiot  微信公众号:linux-code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值