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

LeetCode 面试经典 150_哈希表_有效的字母异位词(42_242_C++_简单)

LeetCode 面试经典 150_哈希表_有效的字母异位词(42_242_C++_简单)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(哈希表):
        • 思路二(使用数组模拟哈希表):
      • 代码实现
        • 代码实现(思路一(哈希表)):
        • 代码实现(思路二(使用数组模拟哈希表)):
        • 以思路一为例进行调试

题目描述:

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。

输入输出样例:

示例 1:
输入:s = “anagram”, t = “nagaram”
输出:true

示例 2:
输入:s = “rat”, t = “car”
输出:false

提示:
1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母

题解:

解题思路:

思路一(哈希表):

1、使用哈希表统计每个字母出现的次数。如果是 s 中出现的字母则增加该字母出现次数,如果是 t 中出现的字母则减小该字母出现的次数,若最终每个字符对应的次数为 0 则为有效的字母异位词。
2、复杂度分析:
① 时间复杂度:O(n),其中 n 为 s 的长度。
② 空间复杂度:O(S),其中 S 为字符集大小,此处 S=26。

思路二(使用数组模拟哈希表):

1、使用一个包含 26 和空间的数组来存储字母出现的次数。
a 对应下标 0
z 对应下标 25

2、复杂度分析:
① 时间复杂度:O(n),其中 n 为 s 的长度。
② 空间复杂度:O(S),其中 S 为字符集大小,此处 S=26。

代码实现

代码实现(思路一(哈希表)):
class Solution1 {
public:// 定义函数 isAnagram,判断两个字符串 s 和 t 是否为字母异位词bool isAnagram(string s, string t) {// 如果两个字符串的长度不同,直接返回 falseif (s.size() != t.size()) {return false;}// 使用 unordered_map 来记录字符的频次unordered_map<char, int> mp_s;// 遍历两个字符串for (int i = 0; i < s.size(); i++) {// 对 s 中的字符进行频次增加mp_s[s[i]]++;// 对 t 中的字符进行频次减少mp_s[t[i]]--;}// 遍历 unordered_map,检查每个字符的频次是否为 0for (auto &c : mp_s) {// 如果某个字符的频次不为 0,说明两个字符串不是字母异位词if (c.second != 0) {return false;}}// 如果所有字符的频次都为 0,说明两个字符串是字母异位词,返回 truereturn true;}
};
代码实现(思路二(使用数组模拟哈希表)):
class Solution2 {
public:// 定义函数 isAnagram,判断两个字符串 s 和 t 是否为字母异位词bool isAnagram(string s, string t) {// 如果两个字符串的长度不同,直接返回 falseif (s.length() != t.length()) {return false;}// 创建一个大小为 26 的 vector,用来存储每个字母出现的次数// 这里我们假设输入字符串只包含小写字母 a-zvector<int> table(26, 0);// 遍历字符串 s,更新每个字符的频次for (auto& ch : s) {table[ch - 'a']++;  // 将字符 ch 对应的频次加 1}// 遍历字符串 t,更新每个字符的频次for (auto& ch : t) {table[ch - 'a']--;  // 将字符 ch 对应的频次减 1// 如果某个字符的频次小于 0,说明 t 中的该字符出现次数超过了 s 中的次数if (table[ch - 'a'] < 0) {return false;  // 说明不是字母异位词,返回 false}}// 如果所有字符的频次都正确(即频次为 0),则返回 true,说明两个字符串是字母异位词return true;}
};
以思路一为例进行调试
#include<iostream>
#include<unordered_map>
#include<vector>
using namespace std;class Solution1 {
public:// 定义函数 isAnagram,判断两个字符串 s 和 t 是否为字母异位词bool isAnagram(string s, string t) {// 如果两个字符串的长度不同,直接返回 falseif (s.size() != t.size()) {return false;}// 使用 unordered_map 来记录字符的频次unordered_map<char, int> mp_s;// 遍历两个字符串for (int i = 0; i < s.size(); i++) {// 对 s 中的字符进行频次增加mp_s[s[i]]++;// 对 t 中的字符进行频次减少mp_s[t[i]]--;}// 遍历 unordered_map,检查每个字符的频次是否为 0for (auto &c : mp_s) {// 如果某个字符的频次不为 0,说明两个字符串不是字母异位词if (c.second != 0) {return false;}}// 如果所有字符的频次都为 0,说明两个字符串是字母异位词,返回 truereturn true;}
};int main(int argc, char const *argv[])
{string s="anagram";string t="nagaram";Solution1 s1;if (s1.isAnagram(s,t)){cout<<"true"<<endl;}else{cout<<"false"<<endl;}return 0;
}

LeetCode 面试经典 150_哈希表_有效的字母异位词(42_242)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

http://www.dtcms.com/a/390638.html

相关文章:

  • go webrtc - 3 工程演示
  • JVM(五)-- 执行引擎
  • 微算法科技(NASDAQ:MLGO)量子架构搜索技术:突破变分量子算法性能瓶颈,实现量子计算的鲁棒优化
  • 海亮科技亮相第十一届亚教展,“教育 + AI”赋能县域教育振兴
  • JMeter的配置元件
  • Charles与Postman、JMeter结合使用教程:高效接口调试与性能测试方案
  • 【Haddop】Hive的离线分析与Sqoop的数据集成
  • 嵌入式 Linux 基础入门笔记(1)
  • Starlink 2.0与3GPP NTN技术对比分析:颠覆性优势与产业格局重构
  • 鸿蒙Next用户文件管理全解析:安全、高效、跨设备的未来体验
  • 简形电力JX2202 智能测试系统:重构新能源电力检测效率标准
  • AI识别视频中动物与人物的技术深度解析
  • iOS 上架完整流程指南 苹果应用发布步骤、App Store 上架流程
  • MySQL-CRUD 操作及常用查询语法详解
  • 玳瑁的嵌入式日记---0919(ARM)
  • Objective-C —— APIs declaration 自定义
  • 【XTDrone】笔记5:control文件详解
  • 抓包的那些事,抓包的原理、常见场景、工具比较与实战排查流程(抓包步骤、iOS 抓包、HTTPS 抓包技巧)
  • 软件工程实践八:Web 前端项目实战(SSE、Axios 与代理)
  • 【常见集合】ArrayList与LinkedList
  • IPD流程实战:如何跨领域应用IPD思维?
  • Archery:开源、一站式的数据库 SQL 审核与运维平台
  • 北斗GNSS在地质灾害监测中的变形监测技术与应用解析
  • C语言题目:用“*”作为元素打印菱形
  • Redis的java客户端(SpringDataRedis)
  • Amazon Aurora DSQL:分布式无服务器数据库的下一场革命
  • TVS管频繁损坏,是参数错选还是布局出问题?-ASIM阿赛姆
  • 论文阅读:TEMPORAL GRAPH NETWORKS FOR DEEP LEARNING ON DYNAMIC GRAPHS
  • 医疗行业淘汰赛开始了?医疗器械售后维修是否会有影响?
  • 第二部分:VTK核心类详解(第40章 vtkIdList ID列表类)