当前位置: 首页 > news >正文

位运算(3)_判定字符是否唯一_面试题

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

位运算(3)_判定字符是否唯一_面试题

收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

温馨提示:

1. 题目链接 :

2. 题目描述 :

3. 解法 :

解法一(哈希表): 

    算法思路 :

    代码展示:

    结果分析:

解法二(位图): 

    算法思路 :

    代码展示:

    结果分析:


温馨提示:

本文的算法题需要一些位运算知识的基础,如果大家还不是很了解的话,可以先去看下面的博客:
位运算(1)_常见位运算总结-CSDN博客

1. 题目链接 :

OJ链接: 判定字符是否唯一

2. 题目描述 :

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

示例 1:

输入: s = "leetcode"
输出: false 

示例 2:

输入: s = "abc"
输出: true

限制:

  • 0 <= len(s) <= 100
  • s[i]仅包含小写字母
  • 如果你不使用额外的数据结构,会很加分。

3. 解法 :

解法一(哈希表): 

    算法思路 :

1. 字符计数:

使用一个长度为 26 的整数数组 hash,用于记录每个字母出现的次数。数组的每个索引对应字母 'a' 到 'z'。
字母 'a' 的 ASCII 值是 97,'a' - 'a' 的结果是 0,因此可以用 ch - 'a' 的方式来映射字符到 hash 数组的索引。
2. 提前检查长度:

在判断字符唯一性之前,首先检查字符串的长度。如果字符串的长度超过 26,则返回 false,因为英文字母只有 26 个,不可能有超过 26 个唯一字符。
3. 更新字符计数:

遍历字符串 astr 中的每个字符,更新 hash 数组。对于每个字符 ch,通过 hash[ch - 'a']++来增加对应的计数。
4. 检查字符频率:

再次遍历 hash 数组,检查每个索引的值。如果有任何一个索引的值大于 1,说明有重复的字符,返回 false。
如果所有的计数都不大于 1,则说明所有字符都是唯一的,返回 true。

    代码展示:

class Solution {
public:bool isUnique(string astr) {int hash[26];if(astr.size() > 26) return false;for(auto ch : astr) hash[ch - 'a']++;for(int i = 0; i < 26; i++)if(hash[i] > 1) return false;return true;}
};

    结果分析:

时间复杂度和空间复杂度
时间复杂度:O(n),其中 n 是字符串 astr 的长度。需要遍历字符串一次来计数,另外再遍历一次 hash 数组来检查字符频率。
空间复杂度:O(1),虽然使用了一个大小为 26 的数组来记录字符计数,但其大小是固定的,不随输入大小变化,因此是常数空间复杂度。

解法二(位图): 

    算法思路 :

利用[位图]的思想,每一个[比特位]代表一个[字符],一个int类型的变量的32位足够表示所有的小写字母.比特位里面如果是0,表示这个字符没有出现过.比特位里面的值是1,表示该字符出现过.

那么我们就可以用一个[整数]来充当[哈希表].

    代码展示:

class Solution {
public:bool isUnique(string astr) {int bitmap = 0;if(astr.size() > 26) return false;for(auto ch : astr){int i = ch - 'a';//位运算如果你不知道优先级的话,能写尽写if((bitmap & (1 << i)) != 0) return false;bitmap |= (1 << i);}return true;}
};

关键点分析:
1. 位图(bitmap)使用:

bitmap 是一个整数,用于表示字符的出现情况。因为字符是小写字母 a - z,总共26个字母,可以用26个二进制位来表示。
每个字母对应一个二进制位,a 对应位 0,b 对应位 1,以此类推。
2. 字符串长度检查:

if (astr.size() > 26) return false; 这一行代码确保了如果字符串的长度超过26,那么必定存在重复字符(因为只有26个小写字母)。
3. 位运算:

int i = ch - 'a'; 计算出当前字符在字母表中的位置。
bitmap& (1 << i) 用于检查第 i 位是否已被设置。如果已设置(不等于0),表示该字符之前已经出现过,因此返回 false。
bitmap |= (1 << i); 将第 i 位设置为1,表示该字符已出现。
4. 返回结果:

如果没有发现重复字符,则返回 true,表示所有字符都是唯一的。

 

 

    结果分析:

 时间复杂度和空间复杂度
时间复杂度:O(n),其中 n 是字符串 astr 的长度。代码遍历字符串一次,进行位运算和条件判断。
空间复杂度:O(1),因为 bitmap 是一个固定大小的整数,只占用常量空间。

优点
高效性:使用位运算可以快速判断字符是否出现,并且时间复杂度为O(n)。
空间利用:只使用一个整型变量来保存所有字符的状态,节省了空间。

相关文章:

  • BSS是什么
  • 谨防火灾!电瓶车检测算法助力城市/小区/园区多场景安全管理精细化、智能化
  • 【Vue】以RuoYi框架前端为例,ElementUI封装图片上传组件——将图片信息转成base64后提交到后端保存
  • 盛事启幕 | 第三届OpenHarmony技术大会重磅官宣,邀您共绘智联未来
  • 深度学习模型可视化工具 Netron 使用教程
  • AndroidStudio依赖报错
  • Qt QIntValidator详解
  • 【以图搜图代码实现2】--faiss工具实现犬类以图搜图
  • 2024/9/30 英语每日一段
  • GORM CRUD
  • Flux【真人模型】:高p高糊反向真实质感!网图风格的Lora模型,超逼真的AI美女大模型!
  • C#测试调用Ghostscript.NET浏览PDF文件
  • 用户体验测试——什么是用户体验?
  • Axure9破解
  • iOS实现解压文件
  • 【React系列】如何构建React应用程序
  • 07.Android之多媒体问题
  • 2017-08-04 前端日报
  • docker容器内的网络抓包
  • ES6 ...操作符
  • JavaScript-Array类型
  • JavaScript的使用你知道几种?(上)
  • nginx 负载服务器优化
  • springMvc学习笔记(2)
  • Webpack 4 学习01(基础配置)
  • 从零开始学习部署
  • 工程优化暨babel升级小记
  • 机器学习中为什么要做归一化normalization
  • 面试遇到的一些题
  • 前端学习笔记之观察者模式
  • 如何在GitHub上创建个人博客
  • 小而合理的前端理论:rscss和rsjs
  • 译自由幺半群
  • 用mpvue开发微信小程序
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​zookeeper集群配置与启动
  • #14vue3生成表单并跳转到外部地址的方式
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (13)DroneCAN 适配器节点(一)
  • (2)STM32单片机上位机
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (c语言+数据结构链表)项目:贪吃蛇
  • (多级缓存)缓存同步
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (四)模仿学习-完成后台管理页面查询
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)项目管理杂谈-我所期望的新人
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net Web窗口页属性