判断一个字符串中的字符是否唯一

来源:互联网 发布:猎天使魔女3知乎 编辑:程序博客网 时间:2024/06/05 22:46
/*实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)*/#include <iostream>   #include <cstring>   using namespace std;   bool is_unique1(string s)   {//字符集是ASCII字符       bool a[256]; //占用较大内存      memset(a, 0, sizeof(a));//将a所指向的256个字节的内存初始化为0       int len = s.length();//不算'\0'       for(int i=0; i < len; ++i)       {           int v = (int)s[i];           if(a[v]) return false;           a[v] = true;       }       return true;   }   bool is_unique2(string s)   {       int a[8]; //8x4个字节足以表示256个位(每个位表示一个字符)    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;   //第v位在第idx个数组第shift位(每个数组有32位)的位置        if(a[idx] & (1 << shift)) return false;           a[idx] |= (1 << shift);  //将第v位置1     }       return true;   }  bool is_unique3(string s)   {  //字符集是a~z(或A~Z)     int check = 0;//4个字节足以表示26个位了       int len = s.length();       for(int i=0; i < len; ++i)       {           int v = (int)(s[i]-'a');           if(check & (1 << v)) return false; //s[i]所在的位为1,表示s[i]重复了,返回false          check |= (1 << v);  //分别将check的各个位 置1     }       return true;   }int main()   {       string s1 = "i am hawstein.";       string s2 = "abcdefghijklmnopqrstuvwxyzABCD1234567890";       cout << is_unique1(s1) << " " << is_unique1(s2) << endl;       cout << is_unique2(s1) << " " << is_unique2(s2) << endl;       return 0;   }

0 0