Crack the code interview_Q1.1

题目

实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)

解决:

首先,我们先简单化问题,假设字符集是ASCII码,由于ASCII码仅占一个字节,需要开辟256个存储空间来标记出现过的字符(如果不是ASCII码情况则不一样,这点必须先和面试官说明)

bool isUnique1(string s)
{
	bool a[256];
	memset(a,0,sizeof(a));
	for(int i=0;i<s.length();i++)
	{
		int val = (int)s[i];//计算第i个字符的ASCII码 
		if(a[val]) return false;//查询该码在a中是否出现过 
		a[val] = true;
	}return true;
}
该算法的时空复杂度均是O(n),其中n为字符串的长度。我们可以通过位运算来减少存储空间的使用。由于ASCII码共有8位,因此我们仅需要长度为8的数组表示这个ascii就行,这里问题的关键是把字符对应的ascii码(整数数字)对应到相应的位(数组)上去,从数学上看就是要把包含256个元素的集合(0~255)映射到8位数组当中,则数组每一位代表(0~31的数值)。举例来说a对应的ascii码为97(01100001),97/32=3, 97%32=1,则将数组的第3位置成1,即可表示出现了字符a。

bool isUnique2(string s)
{
    int a[8];
    memset(a, 0, sizeof(a));
    int len = s.length();
    for(int i=0; i < len; ++i)
    {
        int v = (int)s[i];
        int idx = v/32, shift=v%32;
        if(a[idx] & (1 << shift)) return false;
        a[idx] |= (1 << shift);
    }
    return true;
}
如果字符集只是a-z(或是A-Z),那就更好办了,用位运算只需要一个整型数即可。

bool isUnique3(string s)
{
    int check = 0;
    int len = s.length();
    for(int i=0; i < len; ++i)
    {
        int v = (int)(s[i]-'a');
        if(check & (1 << v)) return false;
        check |= (1 << v);
    }
    return true;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值