大家好,我是小黄呀
题目大意
实现一个算法,确定一个字符串 s
的所有字符是否全都不同。
要求不使用额外的数据结构
思路分析
- 由于题目要求不使用额外的数据结构结题,因此不能使用
set
进行解题(这种方式只需要一行,狗头.jpg),然后直接利用暴力求解的双重循环时间复杂度为O(n^2)
bool
数组方法:根据题目提示,定义一个长度为26的bool
数组,并初始化为0,利用字符对应bool
数组下标进行映射(例如:'a'->0
),然后逐个字符遍历astr
,如果bool
数组中对应的下标值为1则说明重复出现,否则设置对应下标值为1
- 位运算方法:用一个
int
类型的变量mark
来代替长度为26
的bool
数组,将其看做为一个26bit
的二进制机器数,每一个bit
对应一个字符,例如00...001
代表字符a
。然后利用位运算来进行检查。- 首先计算出位移的距离,用
movebit
表示,movebit=astr[i]-'a'
- 然后运用左移运算符
1<<movebit
得到对应下标为1,其余下标为0
的机器数,如字符'b'
,得到数为00...010
- 将左移后的机器数与
mark
进行与&
运算,由于机器数中只存在一个字符标记为1,其余位都为0,因此当与mark
进行与运算时,若该字符标记位运算结果为0,则说明重复出现;为1,则没有重复。 - 若未重复,用或
|=
运算,将mark
值中对应的字符标记位置为1
- 首先计算出位移的距离,用
具体代码
//数组运算方法
bool isUnique2(char* astr)
{
bool flag[128];
memset(flag,0,sizeof(flag));
int len=strlen(astr);
for(int i=0;i<len;i++)
{
if(flag[astr[i]-'a']==1)
return false;
else
flag[astr[i]-'a']=1;
}
return true;
}
//位运算方法
bool isUnique1(char* astr)
{
int mark = 0;
int len=strlen(astr);
for(int i=0;i<len;i++)
{
int movebit = astr[i]-'a';
if((mark & (1<<movebit))!=0)
return false;
else
{
mark |=(1<<movebit);
}
}
return true;
}