刷题笔记判断字符是否唯一
Posted 傅耳耳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题笔记判断字符是否唯一相关的知识,希望对你有一定的参考价值。
题目描述
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例1:
输入: s = "leetcode"
输出: false
示例2:
输入: s = "abc"
输出: true
限制:
- 0 < = l e n ( s ) < = 100 0 <= len(s) <= 100 0<=len(s)<=100
- 不使用额外数据结构
思路
不使用额外数据结构,以下解法不可取:
- set存储出现过的字符
- 二重循环遍历
【位运算】
题中示例仅出现小写字母’a’~‘z’,开辟26个空间的bool数组,可以用26位的int整数代替。
第i位表示第i个字母在字符串中是否存在(为1表示存在)
则该题转换为两个问题:
- 遇到字符c,如何确定其位置是否为1?
- 如何插入没有出现的字符(如何置某个特定位为1)
1. 确定对应位置是否为1
以字母’c’为例:
-
确定字母对应的位置:
mov_bit = 'c' - 'a' = 2
-
1 < < m o v _ b i t 1 << mov\\_bit 1<<mov_bit 即为 0000...00100 0000...00100 0000...00100(字母c对应位置为1)
-
查看对应位是否为1:与原状态mark做与运算
其余位与0相与,结果都为0 若'c'对应位为1,结果不为0,否则结果为0
m a r k & ( 1 < < m o v _ b i t ) mark \\& (1 << mov\\_bit) mark&(1<<mov_bit)
2. 将对应位置1
m a r k ∣ ( 1 < < m o v _ b i t ) mark | (1 << mov\\_bit) mark∣(1<<mov_bit)
当该字符当前唯一时,需要将其对应位由 0 变为 1 <=> 与1进行或运算
其他位与 0 进行或运算,不改变值
代码
bool isUnique(string astr)
int mark = 0;
for(char c : astr)
int mov_bit = c - 'a';
if(mark & (1 << mov_bit))
//结果非0,出现过
return false;
//mark记录
mark = mark | (1 << mov_bit);
return true;
以上是关于刷题笔记判断字符是否唯一的主要内容,如果未能解决你的问题,请参考以下文章