刷题笔记判断字符是否唯一

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’为例:

  1. 确定字母对应的位置:

     mov_bit = 'c' - 'a' = 2
    
  2. 1 < < m o v _ b i t 1 << mov\\_bit 1<<mov_bit 即为 0000...00100 0000...00100 0000...00100(字母c对应位置为1)

  3. 查看对应位是否为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;
 

以上是关于刷题笔记判断字符是否唯一的主要内容,如果未能解决你的问题,请参考以下文章

刷题之路--判断数字是否回文

力扣-面试题刷题第一天

刷题笔记(数组)-12

算法通关手册 刷题笔记1 数组基础

程序员面试题01

LintCode刷题笔记-- LongestCommonSquence