实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = "leetcode"
输出: false 示例 2:
输入: s = "abc"
输出: true限制:
0 <= len(s) <= 100s[i]仅包含小写字母- 如果你不使用额外的数据结构,会很加分。
解题思路:位运算
拿到这道题的第一反应就是使用哈希表来记录字符串的每一个字符,但是这道题其实还可以做到更极致一些,使用一个变量来充当哈希表,然后通过位运算实现哈希映射操作,因为当前只有小写字母,并且只要求出现过一次,那么我们就让一个变量的每一个比特位表示出现过 0 还是 1 次,只要每次循环判断到当前比特位是 1 了,说明之前有出现过该字符,则直接返回错误,如果不存在的话就将该比特位置一即可!
此外还可以运用之前学到的鸽巢原理,就是小写字符有 26 个,那么最多不重复的就是 26 个,也就是说如果字符串长度超过了 26,则代表一定出现了重复的字符!
思路简单,这里就不再赘述了,看代码实现:
class Solution {
public:
bool isUnique(string astr) {
// 鸽巢原理:当小写字符数量超过了26个,说明一定会出现重复的
if(astr.size() > 26)
return false;
// 采用位运算的思想
int hash = 0;
for(int i = 0; i < astr.size(); ++i)
{
// 如果已经出现了一次说明重复了
if((hash >> (astr[i] - 'a')) & 1)
return false;
hash |= (1 << (astr[i] - 'a'));
}
return true;
}
};