【九章斩题录】Leetcode:判定是否互为字符重排(C/C++)

    


面试题 01.02. 判定是否互为字符重排

✅ 模板:C++

class Solution {
public:
    bool CheckPermutation(string s1, string s2) {

    }
};


「 法一 」排序

💡 思路:看到题目中说 "重新排列后能否变成另一个字符串",等等……重新排列?

我勒个豆,这题直接 sort 两下不就秒了?

排序完比对一下两个字符串是不是一样的就行了:

class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        sort(s1.begin(), s1.end());   // 排s1
        sort(s2.begin(), s2.end());   // 排s2 

        return s1 == s2 ? true : false;   // 对比
    }
};

写完了,然后想了想应该可以再优化一下,如果长度不相等那必然不能重排。

而且好像也没必要用三目,直接 return 表达式就行。

class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        if (s1.size() != s2.size()) {   // 检查一下
            return false;
        }
        sort(s1.begin(), s1.end());  
        sort(s2.begin(), s2.end());

        return s1 == s2;   // 脑抽用三目,忘了可以直接返回了。
    }
};

哈哈哈搞定了,sort 排序时间复杂度为 O(nlogN),比较用了 O(n),所以时间复杂度为:

O(nlogN)+O(n) = O(nlogN)

 用 sort 轻松将该题斩于马下……


「 法二 」HashMap!uh~

💡 思路:好像也可以用哈希,HHHHHHHHHash Map!ur!

分别 for 滚一轮 s1 和 s2 的元素:

  • 统计字符串 s1 各字符数量,遇到 +1
  • 统计字符串 s2 各字符数量,遇到 -1
  • 遍历 s1, s2 中各字符的数量差,若 s1, s2 中某字符的数量不一致,则不互为重排。

如果都对上了,就是 "抵消" 了,看代码:

class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        if (s1.size() != s2.size()) {   // 提前解决s1 s2长度不一样的情况
            return false;
        }

        unordered_map<char, int> hash;
        for (char e : s1) {   // 一边加
            hash[e] += 1;
        }
        for (char e : s2) {   // 另一边减
            hash[e] -= 1;
        }

        for (auto kv : hash) {
            if (kv.second != 0) {  
                return false;
            }
        }

        return true;
    }
};

在这里,我特别想感谢一下 auto for 的存在,如果没有 auto for,那么会非常的窒息……

for (unordered_map<char, int>::iterator it = hash.begin(); 
    \ it != hash.end(); it++) {
            if (it->second != 0) {
                return false;
            }
        }

喝完咖啡回来想了想,好像也不用再迭代器判断一遍,s2 的 for 当前元素 -1 后发现<0 的话就可以直接 return false 了,<0 肯定是因为 s1 里压根就没出现过这个字符 (没记录到哈希桶里)……   但这样就 必须要对 s1 和 s2 进行长度判断,长度不同直接 return false。

class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        if (s1.size() != s2.size()) {
            return false;
        }

        unordered_map<char, int> hash;
        for (char& e : s1) {   // 一边加
            hash[e] += 1;
        }
        for (char& e : s2) {   // 另一边减
            hash[e] -= 1;
            if (hash[e] < 0) {
                return false;
            }
        }

        return true;
    }
};

测试,if (<0) 就不能重排。

s1 = a a b b c
s2 = a a b c c
入桶(+):a:2  b:2  c:1    
检查(-):a:0  b:1  c:-1
return false;

s1 = a b c
s2 = b c a
入桶(+):a:1  b:1  c:1    
检查(-):a:0  b:0  c:0
return true;

s1 = a b c
s2 = b a d
入桶(+):a:1  b:1  c:1    
检查(-):a:0  b:0  d:-1
return false;

也可以直接定义一个维护 128 个字符的数组:

class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        if (s1.size() != s2.size()) {
            return false;
        }

        vector<int> table(128, 0);

        for (char& ch : s1) {
            table[ch]++;
        }

        for (char& ch : s2) {
            table[e]--;
            if (table[e] < 0) {
                return false;
            }
        }

        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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第三百一十七回

文章目录 1. 概念介绍2. 实现方法2.1 hintText2.2 labelText2.3 controller 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何在输入框中处理光标"相关的内容&#xff0c;本章回中将介绍如何添加输入框默认值.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1.…

[VulnHub靶机渗透] Misdirection: 1

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

Linux操作系统基础(八):Linux的vi/vim编辑器

文章目录 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 二、打开文件 三、VIM编辑器的三种模式(重点) 四、命令模式相关命令 五、底行模式相关命令 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 vi是visual interface的简称, 是Linux中最经典的文本编辑器 vi的核心设计思想…

专业130+总分410+苏州大学837信号系统与数字逻辑考研经验电子信息与通信,真题,大纲,参考书

今年考研总分410&#xff0c;专业837信号系统与数字逻辑130&#xff0c;整体每门相对比较均衡&#xff0c;没有明显的短板&#xff0c;顺利上岸苏大&#xff0c;总结一下自己这大半年的复习经历&#xff0c;希望可以对大家有所帮助&#xff0c;也算是对自己考研做个总结。 专业…

6 scala-面向对象编程基础

Scala 跟 Java 一样&#xff0c;是一门面向对象编程的语言&#xff0c;有类和对象的概念。 1 类与对象 与 Java 一样&#xff0c;Scala 也是通过关键字 class 来定义类&#xff0c;使用关键字 new 创建对象。 要运行我们编写的代码&#xff0c;同样像 Java 一样&#xff0c;…

烟火可禁却难禁,灵境难及终将及

现实痛点 2024年1月30日&#xff0c;贵阳市发生了一件令人痛心的事&#xff0c;有人在小区内放烟花导致失火&#xff0c;一男子具备足够的消防安全知识&#xff0c;知道如何使用消防栓却因设施不合格接不上消防栓&#xff0c;接上了又没水&#xff0c;消防员来也束手无策&…

#Z2322. 买保险

一.题目 二.思路 1.暴力 训练的时候&#xff0c;初看这道题&#xff0c;这不就打个暴力吗&#xff1f; 2.暴力代码 #include<bits/stdc.h> #define int long long using namespace std; int n,m,fa,x,y,vis[1000001],ans; vector<int> vec[1000001]; void dfs(i…

VitePress-14- 配置-titleTemplate 的作用详解

作用描述 1、titleTemplate 是标题的后缀&#xff1b;2、可以自定义标题的后缀&#xff1b;3、可以自定义整个的标题以及后缀&#xff0c;语法如下&#xff1a; titleTemplate: :title 链接符号 自己定义的后缀 【:title】&#xff1a;从页面的第一个 <h1> 标题推断出的…

Qt视频播放器项目

一.创建项目 二.设计UI 按钮与名称的对应 打开视频按钮 -> pushButton_Open 播放按钮 -> pushButton_Play 暂停按钮 -> pushButton_Pause 停止按钮 -> pushButton_Stop 音量按钮 -> pushButton_Sound设置图标 在项目目录下创建images文件夹&#xff0c;把图标…

2024 [arXiv] ST-LLM——时空大语言模型用于交通预测

这应该是第一个将LLM用于交通预测&#xff08;时空图预测&#xff09;&#xff0c;这篇由南洋理工大学龙程&#xff08;Cheng Long&#xff09;老师团队与商汤&#xff0c;北大和德国科隆大学&#xff08;Cologne&#xff09;合作完成。且抢先使用了最通用的名字时空大模型名字…

CodeWave学习笔记--博物馆预约管理系统

场馆信息管理页面搭建&#xff08;PC&#xff09; 首先是场馆实体的创建 页面的搭建 在总览界面下创建子界面venueManage界面 现在总览页中实现跳转场馆管理子界面 设计场馆管理界面 效果 访客预约申请页面搭建&#xff08;H5&#xff09; 添加H5端&#xff0c;点击确认即可 …

Bean 的作用域

Bean 的作用域种类 在 Spring 中⽀持 6 种作⽤域&#xff0c;后 4 种在 Spring MVC 环境才⽣效 1. singleton&#xff1a;单例作⽤域 2. prototype&#xff1a;原型作⽤域&#xff08;多例作⽤域&#xff09; 3. request&#xff1a;请求作⽤域 4. session&#xff1a;会话作⽤…

JDK新特性

JDK新特性 函数式接口和Lambda 表达式Stream流操作新日期API操作其他新特性 Lambda 是一个匿名函数&#xff0c;我们可以把 Lambda表达式理解为是一段可以传递的代码&#xff08;将代码 像数据一样进行传递&#xff09;。可以写出更简洁、更 灵活的代码。作为一种更紧凑的代码…

操作系统-【预备学习-1】(Linux 文件目录)

文章目录 相关知识目录结构进入目录补充查看目录创建文件删除文件创建文件夹删除文件夹文件和文件夹拷贝文件和文件夹移动/重命名 任务要求 相关知识 目录结构 Linux 文件系统是树形层次结构&#xff0c;具体如下图所示&#xff0c;最重要的是根目录&#xff08;/&#xff09…

8868体育助力西甲皇家马德里俱乐部 帮助球队把握榜首大战

西甲的皇家马德里足球俱乐部是8868体育合作的俱乐部之一&#xff0c;皇家马德里目前取得18胜3平1负的成绩&#xff0c;排名西甲联赛第一的位置&#xff0c;本赛季主场也有着9胜1平的不败成绩&#xff0c;处于第二的位置&#xff0c;主场的发挥相当突出。目前皇家马德里已经是重…

2.8学习总结

2.8 1.二叉树的前序遍历 2.二叉树的中序遍历 3.二叉树的后序遍历 4.⼆叉树的层序遍历 5.⼆叉树的层序遍历2 6.二叉树的右视图 7.二叉树的层平均值 8.N叉树的层序遍历 9.每个树行中找最大值 10.填充每个节点的下一个右侧节点指针 11.填充每个节点的下一个右侧节点指针2 12.生命之…

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-时间管理

目录 一、时间管理1.1、时间接口 一、时间管理 时间管理以系统时钟为基础&#xff0c;给应用程序提供所有和时间有关的服务。系统时钟是由定时器/计数器产生的输出脉冲触发中断产生的&#xff0c;一般定义为整数或长整数。输出脉冲的周期叫做一个“时钟滴答”。系统时钟也称为…

【GO语言卵细胞级别教程】04.GO函数介绍

【GO语言卵细胞级别教程】04.GO函数介绍 目录&#xff1a; 【GO语言卵细胞级别教程】04.GO函数介绍0.创建项目1.函数的引入2.注意事项3.详细介绍3.1 形参介绍 0.创建项目 创建目录 执行命令加载模块 cd 02.gostudy目录下 1.进入目录下 cd 02.gostudy 2.初始化模块变量 go …

【计算机网络】时延,丢包,吞吐量(分组交换网络

时延 结点处理时延(nodal processing delay&#xff09; dproc 排队时延&#xff08;queuing delay&#xff09; dqueue 传输时延&#xff08;transmission delay&#xff09; dtrans 路由器将分组推出所需要的时间&#xff0c;是分组长度和链路传输速率的函数 传播时…

第四篇:SQL语法-DDL-数据定义语言

大年初一限定篇&#x1f600; &#xff08;祝广大IT学习者、工作者0 error 0 warning&#xff01;&#xff09; 一&#xff0c;DDL数据库操作 &#xff08;一&#xff09;库的查询操作 1.列出所有已定义数据库 show databases; 2.查询当前所处数据库 select database(); &…