#include<iostream>
#include<string>
using namespace std;
//面试题一般以接口的形式给出
bool isUniqeString(string s)
{
int len = s.length();
if(!len)return true;
bool flag[256]={0};
for(int i=0;i<len;i++)
{
if(flag[s[i]])return false;
else flag[s[i]]=true;
}
return true;
}
//方法2,用bitmap来节省空间
bool isUniqeStringByBitmap(string s)
{
int intlen=sizeof(int)*8;
int* flag= new int[256/intlen];
int s_len=s.length();
if(!s_len)return true;
for(int i=0;i<s_len;i++)
{
int res=(int)s[i];
int a=res/intlen;
int b=res%intlen;
if((flag[a]&(1<<b)))return false;
else flag[a]|=(1<<b);//给对应的位置1,如:34 a=34/32=1;b=34%32=2; 2的二进制为0000 0010 右移1位或之后为0000 0100
}
return true;
}
int main()
{
string s;
getline(cin,s);
printf("%s\n",isUniqeString(s)?"true":"false");
printf("%s\n",isUniqeStringByBitmap(s)?"true":"false");
return 0;
}
题意:判断一个字符串中是否有重复出现的字符
用位图来表示字符是否重复出现
如:abcde
true
true
如:abcdea
false
false