文章目录
题目链接:
题目描述:
解法
如果使用数据结构的话
- 哈希表:
一个一个字符扫描,不在哈希表里面的就放进去,在里面的就返回
false
。扫描完全部不重复就返回true
。也可以优化一下,字母一共
26
个,可以搞个数组hash[26]
位图
可以用
26
个0
和1
来表示,0
表示没出现过,1
表示出现过。优化:
使用位图前检查字母长度是不是
>26
,是的话就直接返回false
。
C++ 算法代码:
class Solution
{
public:
bool isUnique(string astr)
{
// 利用鸽巢原理来做的优化
if(astr.size() > 26) return false;
int bitMap = 0;
for(auto ch : astr)
{
int i = ch - 'a';
// 先判断字符是否已经出现过
if(((bitMap >> i) & 1) == 1) return false;
// 把当前字符加入到位图中
bitMap |= 1 << i;
}
return true;
}
};
图解
例如:s = "leetcode"
-
astr.size() < 26
bitMap
就是位图,初始化为0
,表示所有字符都尚未出现。进入循环,
字符 ‘
l
’ 对应的索引i = 'l' - 'a' = 11。
检查bitMap
的第11
位:
bitMap = 0
,第11
位为0
。
将第11
位置为1
:
bitMap = 0 | (1 << 11) = 2048。
-
进入循环,
字符 ‘
e
’:
字符 ‘e
’ 对应的索引i = 'e' - 'a' = 4。
检查bitMap
的第4
位:
bitMap = 2048
,第4
位为0
。
将第4
位置为1
:
bitMap = 2048 | (1 << 4) = 2112。
-
进入循环,
字符 ‘
e
’:
字符 ‘e
’ 对应的索引i = 'e' - 'a' = 4。
检查bitMap
的第4
位:
bitMap = 2112
,第4
位为1
(之前已经设置为1
)。
发现重复字符e
,函数返回false
。