/*
实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)
*/
#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;
}
判断一个字符串中的字符是否唯一
最新推荐文章于 2021-11-18 00:02:34 发布