解法一:利用额外空间
1、思路
假设字符串只包含ASCII
码,一共128个字符,开一个数组然后遍历字符串就可以判断是否存在重复字符了。其实空间复杂度仍然是$O(1)$的,因为数组大小永远不会超过128。
2、代码
class Solution {
public:
bool isUnique(string astr) {
vector<bool> h(128, false);
for (char &ch : astr)
{
int val = ch; //自动类型转换,将char转换为对应的ASCII码数值
if (h[val]) return false;
h[val] = true;
}
return true;
}
};
解法二:位运算
1、思路
假设字符串中只包含小写字母a-z
一共26个,一个int
型变量有32位,我们可以用int
变量的0~25
位来分别表示26个字母。
2、代码
class Solution {
public:
bool isUnique(string astr) {
int chack = 0; //int型变量
for (char &ch : astr)
{
if (chack & (1 << (ch - 'a'))) return false; //当前位所表示的字母已经出现过
chack |= (1 << (ch - 'a')); //累加当前字母所代表的的位
}
return true;
}
};