问题描述:
实现一个算法,确定一个字符串 s
的所有字符是否全都不同。
示例 1:
输入: s = "leetcode" 输出: false
示例 2:
输入: s = "abc" 输出: true
限制:
0 <= len(s) <= 100
s[i]
仅包含小写字母- 如果你不使用额外的数据结构,会很加分。
解决方案:
查重 ==> 位运算:
(用空间换时间)
一个字节占八位二进制数表示,即表示3 : 0000 1000,在1左移三位
char:一个字节 || int:四个字节,即4*8 位
字母表26个字母:取4*8--> int 四个字节即可。
数字0~9对应的ASCII码(十进制)为“48”~“57” 大写字母A~Z对应的ASCII码(十进制)为“65”~“90” 小写字母a~z对应的百ASCII码(十进制)为"97"~“122”
例如:
abc:1 左移(<<)99,98,97 位
位运算规则:
(对比逻辑与(&&),或(||),非!)
用一个字节,化为 8 位二进制计算
1-:位与:& --> 1 & 0 ==> 0
(有 0 全为 0 -->一假全假)
2-:位或:| --> 1 | 0 ==> 1
(有 1 全为 1-->一真全真)
( 可进行赋值运算!)
3-:位非:~ --> ~1 ==> 0000 0001-->1111 1110
(类比补码,反码...)
4-:异或:^--> 1 ^ 1 ==> 0
1 ^ 0 ==> 1
(不同则为 1 )
判断重复:
在 x 中 ,x | (1<< 99):表示x 第99 位如果是 1 ,则1<< 99 | x ==> 1 | 1 ==1 则重复。
函数代码:
// 方法函数如下: class Solution { public: bool isUnique(string astr) { int* x =new int; *x=0; for(int i = 0; i < astr.size(); i++) { if(*x & (1 << (astr[i] - 'a'))){ delete x; return false; } else *x |= (1 << (astr[i] - 'a')); } delete x; return true; } };