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数组
[cpp]
view plain
copy
print
?
- 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;
- }
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
[cpp]
view plain
copy
print
?
- 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;
- }
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字符
[cpp]
view plain
copy
print
?
- 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;
- }
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)。