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

来源:互联网 发布:html的js加减怎么做 编辑:程序博客网 时间:2024/06/05 00:39

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?
  1. bool isUniqueChars1(string &str)  
  2. {  
  3.     bool *char_set=new bool[256];  
  4.     memset(char_set,0,256);  
  5.     for(int i=0; i<str.length(); i++)  
  6.     {  
  7.         if(char_set[str.at(i)])  
  8.         {   
  9.             delete []char_set;   
  10.             return false;  
  11.         }   
  12.         char_set[str.at(i)]=true;  
  13.     }  
  14.     return true;  
  15. }  
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?
  1. bool isUniqueChars2(string &str)  
  2. {  
  3.     bitset<256> char_set;  
  4.     char_set.reset();  
  5.     for(int i=0; i<str.length(); i++)  
  6.     {  
  7.         if(char_set.test(str.at(i)))  
  8.             return false;  
  9.         char_set.set(str.at(i));  
  10.     }  
  11.     return true;  
  12. }  
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?
  1. bool isUniqueChars3(string &str)   
  2. {  
  3.     int checker=0;  
  4.     for(int i=0; i<str.length(); i++)  
  5.     {  
  6.         int val=str.at(i)-‘a’;  
  7.         if((checker&(1<<val))>0)  
  8.             return false;  
  9.         checker|=(1<<val);  
  10.     }  
  11.     return true;  
  12. }  
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)。

阅读全文
0 0
原创粉丝点击