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、代码详解
  • 首先检查字符串长度。如果长度超过 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;
        }

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

4、总结

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

相关推荐
江畔柳前堤几秒前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore1 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考3 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX3 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面4 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号4 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽4 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI5 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者6 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者6 小时前
【征程6】校准量化中HistogramObserver解析
算法