【九章斩题录】Leetcode:判定字符是否唯一(C/C++)

2023-09-13 14:31:26

     精品题解 🔥 《九章斩题录》  👈 猛戳订阅


面试题 01.01. 判定字符是否唯一

✅ 模板:C语言

class Solution {
public:
    bool isUnique(string astr) {

    }
};

💭 思考:《程序员面试金典》里的题,这题和剑指Offer的 "数组中重复的数字" 几乎一模一样啊,只是重复的数字变成了重复的字符,判断 "重复" 和判断 "是否唯一" 在这里实际上是一样的。


「 法一 」暴力大法

💡 思路:用两个 for 暴力,外层 for 依次选定一个锚点,然后内层 for 从锚点下一个位置开始找。找到相同的就说明不是唯一的,我们返回 false。如果循环结束仍然没找到,那就说明字符都是唯一的,返回 true。优点就是简单,但时间复杂度是 O(n^2)

💬 代码演示:

class Solution {
public:
    bool isUnique(string astr) {
        for (int i = 0; i < astr.size(); i++) {
            for (int j = i + 1; j < astr.size(); j++) {
                if (astr[i] == astr[j]) {
                    return false;
                }
            }
        }
        return true;
    }
};

🚩 运行结果如下:

「 法二 」哈希无序集

💡 思路:既然要找是否唯一,很容易想到用哈希,这里可以利用 unordered_set。既然要找重复的元素,本质上就是看是否 unique (唯一),这让我们想到了数学中的集合,可以利用 "集合元素是唯一的" 的特点。拿题目中的例子来说,如果我们以集合的方式存储一遍该字符串,那么如果在存储过程中出现重复,那么不就找到我们想要的 target 了吗?

我们知道,set 的底层是红黑树,时间复杂度为 \color{}O(logN),而 unordered_set 的期望复杂度能够达到 \color{}O(1)。所以这里我们选择使用 unordered_set。

unordered_set 我们仍然是用 count 来检查是否在 hash 表内,用 insert 来插入。

💬 代码演示:

class Solution {
public:
    bool isUnique(string astr) {
        unordered_set<char> u_set;
        for (int i = 0; i < astr.size(); i++) {
            if (u_set.count(astr[i]) == 0) {
                u_set.insert(astr[i]);
            }
            else {
                return false;
            }
        }
        return true;
    }
};

🚩 运行结果如下:

「 法三 」排序 + 遍历

💡 思路:我们可以尝试 "排序 + 遍历" 的方法,先对字符串进行排序,因为排序后,相同的字符肯定是紧挨着的,如此一来,我们只需要一层循环遍历一遍排序完的字符串即可。遍历时将下标 \color{}i 设置从 1 开始,依次和 \color{}i-1 下标的元素做对比即可。排序可以直接调 sort。

💬 代码演示:

class Solution {
public:
    bool isUnique(string astr) {
        sort(astr.begin(), astr.end());
        for (int i = 1; i < astr.size(); i++) {
            if (astr[i - 1] == astr[i]) {
                return false;
            }
        }
        return true;
    }
};

「 法四 」st 数组

💡 思路:在遍历字符串时,使用 st 数组记录当前字符,如果该字符存在则说明该字符不是唯一。

class Solution {
public:
    bool isUnique(string astr) {
        bool st[10000] = { 0 };   // 初始化为0
        for (int i = 0; i < astr.size(); i++) {
            if (st[ astr[i] ] != 0) {   // 如果不为0
                return false;
            }
            st[ astr[i] ] = 1;    // 设置为1
        }
        return true;
    }
};

「 法五 」位运算

💡 思路:题目说不使用额外数据结构加大分,好好好。

class Solution {
public:
    bool isUnique(string astr) {
        int mark = 0;
        int move_bit = 0;
        for (auto e : astr) {
            move_bit = e - 'a';
            if (mark & (1 << move_bit)) {
                return false;
            }
            else {
                mark |= (1 << move_bit);
            }
        }
        return true;
    }
};

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2023.
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

C++reference[EB/OL]. []. http://www.cplusplus.com/reference/.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

牛客网. 剑指offer 题解 [EB/OL]. []. https://www.nowcoder.com/exam/oj/ta?tpId=13.

更多推荐

HTML 学习笔记(基础)

它是超文本标记语言,由一大堆约定俗成的标签组成,而其标签里一般又有一些属性值可以设置。W3C标准:网页主要三大部分结构:HTML表现:CSS行为:JavaScript<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewpor

配置 iSCSI 服务并实现客户端自动挂载块设备

文章目录前言1.iSCSI简介2.iSCSIServer端配置2.1.添加磁盘2.2.安装targetcli软件包2.3.创建块设备2.4.创建Target2.5.创建LUN2.6.创建ACL2.7.配置门户创建监听2.8.查看全部配置信息并保存退出2.9.启用Target服务3.iSCSIClient端配置3.1.安

C# 扫描并读取图片中的文字(.NET Core)

本文介绍如何通过C#程序来扫描并读取图片中的文字,这里以创建一个.NetCore程序为例。下面是具体步骤,供参考。程序测试环境:VisualStudio版本要求不低于2017图片扫描工具:Spire.OCRfor.NET图片格式:png(这里的图片格式支持JPG、PNG、GIF、BMP、TIFF等格式)扫描的图片文字:

HT for Web (Hightopo) 使用心得(2)- 2D 图纸、节点、连线 与基本动画

概括来说,用HTforWeb做可视化主要分为两部分,也就是2D和3D。这两部分需要单独创建。在它们被创建完成后,我们再把它们集成到一起。HTforWeb的2D部分主要是指ht.graph.GraphView(简称GraphView,也就是2D图纸)。所谓2D图纸其本质是一个canvas。我们可以在上面进行基本图形的绘制

MeterSphere v2.10.X-lts 双节点HA部署方案

一、MeterSphere高可用部署架构及服务器配置1.1服务器信息序号应用名称操作系统要求配置要求描述1负载均衡器CentOS7.X/RedHat7.X2C,4G,200GB部署Nginx,实现负载路由。部署NFS服务器。2MeterSphere应用节点1CentOS7.X/RedHat7.X8C,16GB,200G

数据可视化

一、Flask介绍#通过访问路径,获取用户的字符串参数@app.route('/user/<name>')defwelcome(name):return"你好,%s"%name@app.route('/user/<int:id>')defwelcome2(id):return"你好,%d号的会员"%id能够自动根据参数

Web 3.0 安全风险,您需要了解这些内容

随着技术的不断进步,我们正迎来一个全新的互联网时代,被称为Web3.0。Web3.0将带来许多令人兴奋的机会,但与之同时,也伴随着一系列新的安全风险。在这篇文章中,我们将探讨Web3.0的安全挑战,以帮助您更好地了解并准备迎接这个新时代。Web3.0简介Web3.0是互联网的下一代,将构建在区块链、分布式技术和智能合约

人工智能:人脸识别技术应用场景介绍

目录人脸识别介绍什么是人脸识别技术人脸识别的流程1、场景分类2、认证对比3、金融领保险应用3.1金融行业3.2保险行业4、安防交通领域4.1公园景点人脸识别闸机4.2高铁站进站人脸识别闸机5、警务领域5.1抓拍交通违法人脸识别介绍什么是人脸识别技术人脸识别技术是一种通过计算机技术和模式识别算法来识别和验证人脸的技术。它

SQLyog 各版本下载与安装(目前最新版本为13.2.0)

文章目录一、SQLyogUltimate各版本下载1.ForWindowsx642.ForWindowsx86二、SQLyogCommunity各版本下载1.ForWindowsx642.ForWindowsx863.ForLinuxx86_644.ForLinuxi386三、SQLyog安装四、如何解决SQLyog试

月木学途开发 1.后台用户模块

概述权限控制采用springsecurity数据库设计用户表DROPTABLEIFEXISTS`admin`;CREATETABLE`admin`(`aid`int(32)NOTNULLAUTO_INCREMENT,`email`varchar(50)DEFAULTNULL,`username`varchar(50)D

Java————List

一、顺序表和链表线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。1.顺序表顺序表是

热文推荐