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
该算法的时空复杂度均是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;
}





你可能感兴趣的:(面试珠玑)