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,则返回 falseif (hash[ch - 'a'] > 1) {return false;}}// 如果没有发现重复字符,返回 truereturn true;}
};
2.3、代码详解
  • 首先检查字符串长度。如果长度超过 26,立即返回 false,因为小写字母只有 26 个,无法保证全部字符唯一。
  • 初始化一个长度为 26 的整型数组 hash,用于记录每个字母的出现次数。
  • 使用范围循环遍历字符串中的每个字符。
  • 计算当前字符在 hash 数组中的索引,并将其对应的值加 1。如果某个字符的计数大于 1,表示该字符重复,立即返回 false
  • 遍历结束后,如果没有重复字符,则返回 true

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;}// 如果没有发现重复字符,返回 truereturn true;}
};
3.3、代码详解
  • 同样首先检查字符串长度。如果长度超过 26,直接返回 false
  • 初始化一个整型变量 bitMap,初始值为 0,用于记录字符的出现情况。
  • 遍历字符串中的每个字符。计算当前字符在 bitMap 中对应的位位置。
  • 检查 bitMap 中相应的位是否已经为 1。如果为 1,表示该字符已出现过,返回 false。如果当前字符没有出现过,将对应的位设置为 1。
  • 遍历结束后,如果没有重复字符,返回 true

4、总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

w208基于spring boot物流管理系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-22- 操作鼠标拖拽 - 下篇(详细教程)

1.简介 上一篇中&#xff0c;宏哥说的宏哥在最后提到网站的反爬虫机制&#xff0c;那么宏哥在自己本地做一个网页&#xff0c;没有那个反爬虫的机制&#xff0c;谷歌浏览器是不是就可以验证成功了&#xff0c;宏哥就想验证一下自己想法&#xff0c;其次有人私信宏哥说是有那种…

神经网络常见激活函数 8-SELU函数

SELU 缩放指数线性单元&#xff1a;SELU&#xff08;Scaled Exponential Linear Unit&#xff09; 函数导函数 SELU函数 S E L U ( x ) { λ x x > 0 λ α ( e x − 1 ) x ≤ 0 \rm SELU(x) \left\{ \begin{array}{} \lambda x \quad & x > 0 \\ \lambda \alph…

【Elasticsearch】多字段查询方式汇总

在 Elasticsearch 中&#xff0c;实现多字段查询的常见方式有以下几种&#xff0c;每种方式适用于不同的场景&#xff1a; --- ### 1. **multi_match 查询** - **用途**&#xff1a;在多个字段中执行同一查询&#xff0c;支持多种匹配策略。 - **关键参数**&#xff1a…

多线之旅:wait 与 notify

今天小编继续来分享下多线程中的一些内容。 在多线程环境下&#xff0c;由于线程调度的不确定性&#xff0c;所以我们有时候无法很好的去保证其线程的执行顺序。 但是呢&#xff0c;我们又要实现这个顺序执行&#xff0c;所以我们可以使用到这两个方法&#xff0c;wait 和 no…

批量修改mysql字符串字段子字符串

替换子字符串 使用 REPLACE 函数替换字段中的特定子字符串。 示例&#xff1a; 将 table_name 表中 column_name 字段的所有 old_value 替换为 new_value。 UPDATE table_name SET column_name REPLACE(column_name, old_value, new_value) WHERE column_name LIKE %old_val…

达梦:AWR 生成

目录标题 AWR 性能诊断与报告生成1. 检查 AWR 系统状态2. 查看数据库中的所有表空间3. 查看现有的 AWR 快照4. 设置 AWR 快照的时间间隔5. 创建 AWR 快照6. 查看最新的 AWR 快照7. 生成 AWR HTML 报告8. 将 AWR 报告保存到指定文件链接总结 自动工作集负载信息库 AWR 报告解析指…

股票数据接口API实例代码python、JAVA等多种语言演示免费获取实时数据、历史数据、CDMA、KDJ等指标数据配有API说明文档

​ 本文中所有接口均可直接在浏览器打开获取数据&#xff0c;为了便于大家验证有效性&#xff0c;已经做好了超链接&#xff0c;直接点击即可&#xff01; 沪深两市股票列表 API接口链接&#xff08;可点击验证&#xff09;&#xff1a;https://api.mairui.club/hslt/list/b…

深入理解DOM:22个核心知识点与代码示例

本文系统介绍DOM相关的22个核心概念&#xff0c;每个知识点均提供代码示例及简要说明&#xff0c;帮助开发者全面掌握DOM操作技巧。 一、DOM基础概念 1. DOM概念 DOM&#xff08;Document Object Model&#xff09;是HTML/XML的编程接口&#xff0c;通过JavaScript可动态修改…

【Map vs Set】:Java数据存储的“双子星”对决

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 &#x1f370;一、搜索 &#x1f36e;1.概念 &#x1f36e;2.模型 &#x1f370;二、Map &#x1f368;1.什么是Map&#xff1f; &#x1f368;2.Map的实例化 &…

【C语言 】C语言 桌游开发数字竞拍(源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【C语言 】C语言 桌游开发数字竞拍&#xff08;源码…

Reinforcement Learning Heats Up 强化学习持续升温

Reinforcement Learning Heats Up 强化学习持续升温 核心观点&#xff1a;强化学习正成为构建具有高级推理能力大语言模型&#xff08;LLMs&#xff09;的重要途径。 最新进展 模型示例&#xff1a;近期出现了如DeepSeek - R1及其变体&#xff08;DeepSeek - R1 - Zero&#xf…

Whisper+T5-translate实现python实时语音翻译

1.首先下载模型&#xff0c;加载模型 import torch import numpy as np import webrtcvad import pyaudio import queue import threading from datetime import datetime from faster_whisper import WhisperModel from transformers import AutoTokenizer, AutoModelForSeq2…

湖仓分析|浙江霖梓基于 Doris + Paimon 打造实时/离线一体化湖仓架构

导读&#xff1a;浙江霖梓早期使用 CDH 产品套件搭建了大数据系统&#xff0c;面临业务逻辑冗余、查询效率低下等问题&#xff0c;基于 Apache Doris 进行整体架构与表结构的重构&#xff0c;并基于湖仓一体和查询加速展开深度探索与实践&#xff0c;打造了 Doris Paimon 的实…

git bash在github的库中上传或更新本地文件

一、将本地文件上传到 GitHub 仓库 1. 创建 GitHub 仓库 如果你还没有在 GitHub 上创建仓库&#xff0c;首先需要创建一个新的仓库&#xff1a; 登录到 GitHub。点击右上角的 按钮&#xff0c;选择 New repository。给你的仓库起个名字&#xff0c;并选择 Public 或 Privat…

Jmeter压测怎么控制TPS

压测固定TPS的接口 有些任务需要我们控制接口的TPS&#xff0c;例如每秒请求一次。 TPS定时器 然后1个并发持续运行 压测结果 需要注意TPS在1.0/s左右&#xff0c;有时可能是1.2、1.3&#xff0c;定时器会自动调整压力&#xff0c;让TPS保持在1.0左右。

ArcGISPro 新建shp+数据结构

import arcpy# 设置工作空间和 Shapefile 存放路径 shp_path r"C:\path\to\your\folder\PolygonZY.shp" # Shapefile 存放路径 fields [("CHBH", "TEXT", 20),("ZCMC", "TEXT", 100),("ZCLX", "TEXT"…

理解WebGPU 中的 GPUAdapter :连接浏览器与 GPU 的桥梁

在 WebGPU 开发中&#xff0c; GPUAdapter 是一个至关重要的对象&#xff0c;它作为浏览器与 GPU 之间的桥梁&#xff0c;为开发者提供了请求 GPU 设备、查询 GPU 特性以及获取适配器信息的能力。本文将详细介绍 GPUAdapter 的核心属性和方法&#xff0c;并通过实际代码…

信呼OA办公系统sql注入漏洞分析

漏洞描述 信呼OA办公系统uploadAction存在SQL注入漏洞&#xff0c;攻击者可利用该漏洞获取数据库敏感信息。 环境搭建 源码下载地址&#xff1a;https://github.com/rainrocka/xinhu 下载后解压到本地网站根目录下&#xff0c;配置好数据库&#xff0c;然后安装即可 默认密…

vue框架生命周期详细解析

Vue.js 的生命周期钩子函数是理解 Vue 组件行为的关键。每个 Vue 实例在创建、更新和销毁过程中都会经历一系列的生命周期阶段&#xff0c;每个阶段都有对应的钩子函数&#xff0c;开发者可以在这些钩子函数中执行特定的操作。 Vue 生命周期概述 Vue 的生命周期可以分为以下几…