判断字符串中有无重复字符,不用额外额数据结构

CareerCup一道题。原题:Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?

additional data structures我的理解是指自己再定义的数据结构。在这里考虑用数组、bitset、以及一个int类型数 。

在这里考虑用数组、bitset、以及一个int类型数 
string是ASCII,占八位,共有256个。从左向右扫描字符串,出现的字符记录下来,当第二次再出现时即可判断。
可以使用bool数组 、bieset,如果只有a-z的小写字符,26为存储即可,用一个int数(32位)即可 。

1、用bool数组

bool isUniqueChars1(string &str)
{
	bool *char_set=new bool[256];
	memset(char_set,0,256);
	for(int i=0; i<str.length(); i++)
	{
		if(char_set[str.at(i)])
		{ 
			delete []char_set; 
			return false;
		} 
		char_set[str.at(i)]=true;
	}
	return true;
}

2、用bieset

bool isUniqueChars2(string &str)
{
	bitset<256> char_set;
	char_set.reset();
	for(int i=0; i<str.length(); i++)
	{
		if(char_set.test(str.at(i)))
			return false;
		char_set.set(str.at(i));
	}
	return true;
}

3、用int数,此时假设字符串只包含a-z字符

bool isUniqueChars3(string &str) 
{
	int checker=0;
	for(int i=0; i<str.length(); i++)
	{
		int val=str.at(i)-'a';
		if((checker&(1<<val))>0)
			return false;
		checker|=(1<<val);
	}
	return true;
}


如果遍历字符串,把每一个字符用来和其他字符做比较,那么时间复杂度O(n^2),但是不用额外空间

如果允许打乱字符串,可以把字符串排序,再扫描一遍即可。排序复杂度O(nlogn)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值