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

01.01、判定字符是否唯一

01.01、[简单] 判定字符是否唯一

1、题目描述

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

在这一题中,我们的任务是判断一个字符串s中的所有字符是否全都不同。我们将讨论两种不同的方法来解决这个问题,并详细解释每种方法的实现过程。

2、方法一:使用哈希表计数

2.1、思路解析

我们可以利用一个哈希表(数组)来记录字符串中每个字符的出现次数。具体步骤如下:

  1. 字符数判断:如果字符串的长度超过 26,那么肯定有重复字符,因为只有 26 个小写字母。
  2. 哈希表初始化:创建一个长度为 26 的数组hash,用于记录每个字符的出现次数。
  3. 遍历字符串:对于字符串中的每个字符,将对应的哈希表位置加 1。
  4. 重复字符检测:在遍历过程中,如果某个字符的出现次数大于 1,直接返回false
  5. 返回结果:遍历结束后,如果没有发现重复字符,返回true
2.2、代码实现
class Solution { public: bool isUnique(string astr) { // 如果字符串长度超过 26,必然有重复字符 if (astr.size() > 26) { return false; } // 初始化一个哈希表,长度为 26,对应 26 个字母 int hash[26] = {0}; // 遍历字符串中的每个字符 for (const auto& ch : astr) { // 将字符转换为相应的索引位置 hash[ch - 'a']++; // 如果某个字符的计数大于 1,则返回 false if (hash[ch - 'a'] > 1) { return false; } } // 如果没有发现重复字符,返回 true return true; } };
2.3、代码详解

3、方法二:使用位图优化

3.1、思路解析

第二种方法使用了位图(bit vector)来优化空间复杂度。这种方法的核心思想是使用一个整数的位来表示字符是否出现过。具体步骤如下:

  1. 字符数判断:与方法一相同,首先判断字符串长度是否超过 26。
  2. 位图初始化:使用一个整数bitMap来表示字符出现情况,初始值为 0。
  3. 遍历字符串:对于字符串中的每个字符,检查bitMap中相应的位置是否已经设置。
  4. 重复字符检测:如果bitMap中相应的位置已经设置过,返回false。否则,将该位置设置为 1。
  5. 返回结果:遍历结束后,如果没有发现重复字符,返回true
3.2、代码实现
class Solution { public: bool isUnique(string astr) { // 利用鸽巢原理来做的优化,如果字符串长度超过 26,必然有重复字符 if (astr.size() > 26) return false; // 使用位图(bit vector)来记录字符出现情况 int bitMap = 0; // 遍历字符串中的每个字符 for (const auto& ch : astr) { int i = ch - 'a'; // 将字符转换为相应的位位置 // 判断当前字符是否已经在 bitMap 中出现过 if (((bitMap >> i) & 1) == 1) return false; // 如果已出现,返回 false // 将当前字符加入到 bitMap 中 bitMap |= 1 << i; } // 如果没有发现重复字符,返回 true return true; } };
3.3、代码详解

4、总结

这两种方法都可以有效地判断一个字符串中的字符是否全都不同。方法一使用了哈希表,代码直观易懂,而方法二使用了位图优化,节省了空间。如果字符串长度超过 26,直接返回false,因为小写字母只有 26 个,因此这是一种基于鸽巢原理的优化。选择哪种方法取决于具体的需求和优化目标。

http://www.jsqmd.com/news/750744/

相关文章:

  • WeChatIntercept:解决Mac微信消息撤回问题的技术方案
  • DevCleaner:macOS开发者必备的磁盘清理工具,一键释放Xcode与Docker缓存空间
  • 保姆级教程:用Kali和VMware从零搭建DC1靶场(附全套工具包下载)
  • robosuite控制器详解:从关节控制到全身逆动力学的完整教程
  • 别再瞎选了!Fluent压力-速度耦合算法SIMPLE/SIMPLEC/PISO到底怎么选?附实战避坑指南
  • 终极Lem编辑器配置指南:自定义主题、键绑定与高效工作流
  • 从裸机到TMOS:手把手教你用WCH CH582 BLE芯片实现多任务调度(附完整代码)
  • 炉石传说脚本:5个步骤实现智能自动对战,新手也能轻松上手
  • 开源项目国际化实战指南:从零构建多语言支持系统
  • 如何系统优化LLaMA2-Accessory超参数:解锁大模型训练最佳实践
  • pynput跨平台开发秘籍:解决Windows、macOS、Linux兼容性问题
  • Memix:为AI编程助手构建项目大脑,实现精准上下文与智能决策
  • 如何用LinkSwift实现八大网盘直链下载:3步搞定高速下载难题
  • 开源智能体框架smartgpt:让大语言模型学会“规划-执行-验证-反思”的思考循环
  • JavaCPP Presets高级应用:构建企业级AI解决方案的终极指南
  • TrafficMonitor插件使用指南:在Windows任务栏构建多维度信息监控中心
  • Retrieval-based-Voice-Conversion-WebUI:10分钟快速上手AI语音转换完整指南
  • 告别下载等待:九大网盘直链解析工具完全指南
  • 医疗影像诊断AI:LLM与多模态技术的融合应用
  • AutoCAD字体缺失终极解决方案:FontCenter智能管理插件完全指南
  • SCP单细胞数据分析教程:从零开始掌握生物信息学工具
  • 终极指南:Zebra分布式数据访问层核心架构解析与实战应用
  • 每天节省20分钟:用淘金币自动化脚本重新掌控你的碎片时间
  • Windows终极指南:3分钟解决iPhone USB网络共享驱动问题
  • 基于大语言模型的电商智能客服系统:架构、部署与RAG实战
  • taotoken cli工具如何一键配置团队开发环境
  • 如何快速解决Godot逆向工程中的GDExtension插件兼容性问题:3步完整指南
  • Bebas Neue开源项目:从字体选择困境到设计自由的三步破解法
  • 高效跨平台下载喜马拉雅VIP音频:xmly-downloader-qt5深度使用指南
  • TV Bro电视浏览器:让您的智能电视变身全能上网终端