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

Leetcode_242.有效的字母异位词

在这里插入图片描述
拿到题我们先来分析一下,对于这道题目,题中给定了两个字符串,通过一系列的判断,来得出这个字符串是否为字母异位词。字母异位词,通过示例得到,就是两个字符串中的字母出现的次数相同,只是顺序形同或者不同。统计出现的个数我们想到了哈希表,这道题由于是关联了字母和出现的次数,所以首选map类型的容器,由于map底层是红黑树实现,查找效率过于慢,这里我们使用unordered_map,底层是哈希实现,查找速度更优。

下来解释一下代码的逻辑思路:

  1. 字母异位相同首先要求两个字符串的长度要一致,所以第一步,判断字符串的长度是否相同,如果不相同直接返回false
  2. 首先将字符串 s 存入容器中,字符串中出现一次这个字符,那么这个字符所对应的value值就加一,在c++ unordered_map容器中,如果字符不存在,会自动初始化为0然后+1
  3. 下来遍历 t 字符串,如果 mp 容器中已经出现了当前的字符,那么这个字符所对应的value值减1
  4. 最后得到,如果容器中的所有字符所对应的value值都为0,则这两个字符串为字母异位词

c++代码:

class Solution {
public:bool isAnagram(string s, string t) {// 如果两个字符串长度不同,直接返回false(因为字母异位词必须长度相同)if(s.size() != t.size()) return false;// 使用哈希表统计每个字符的出现次数unordered_map<char, int> mp;int len = s.size();// 遍历字符串s,统计每个字符出现的次数for(int i = 0; i < len; i++){mp[s[i]]++; // 如果字符不存在,会自动初始化为0然后+1}// 遍历字符串t,减少哈希表中对应字符的计数for(int i = 0; i < t.size(); i++){// 如果当前字符存在于哈希表中,减少其计数if(mp.find(t[i]) != mp.end()){mp[t[i]]--;}// 如果字符不存在,可以提前返回false(后面统一检查)}// 检查哈希表中所有字符的计数是否归零for(auto &e : mp){// 如果有字符的计数不为0,说明不是字母异位词if(e.second != 0) return false;}// 所有字符计数都为0,是字母异位词return true;}
};

Java代码:

class Solution {public boolean isAnagram(String s, String t) {if (s.length() != t.length()) {return false;}HashMap<Character, Integer> mp = new HashMap<>();// 统计 s 的字符频率for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);mp.put(c, mp.getOrDefault(c, 0) + 1);}// 用 t 的字符减少计数for (int i = 0; i < t.length(); i++) {char c = t.charAt(i);if (!mp.containsKey(c)) {return false; // t 包含 s 没有的字符}mp.put(c, mp.get(c) - 1);if (mp.get(c) < 0) {return false; // t 的某个字符比 s 多}}// 检查所有计数是否为 0for (int count : mp.values()) {if (count != 0) {return false;}}return true;}
}

但是这种方法的效率比较低,由于这道题只有小写字母,小写字母只有26个,因此我们可以使用数组来模拟哈希表,进一步的提升效率

c++代码:

class Solution {
public:bool isAnagram(string s, string t) {if(s.size()!=t.size()) return false;int hash[26];int len=s.size();memset(hash,0,sizeof(hash));for(int i=0;i<len;i++){hash[s[i]-97]++;}for(int i=0;i<len;i++){hash[t[i]-97]--;}for(int i=0;i<26;i++){if(hash[i]!=0) return false;}return true;}
};

总体思路差不多,需要注意的是 在ascill码表中,a代表的是97,我们这里将其减去97是为了对应数组的0号索引,同时z对应了数组的25号索引

http://www.lryc.cn/news/602231.html

相关文章:

  • Apache Commons VFS:Java内存虚拟文件系统,屏蔽不同IO细节
  • python入门篇12-虚拟环境conda的安装与使用
  • 深入Go并发编程:Channel、Goroutine与Select的协同艺术
  • 博士申请 | 荷兰阿姆斯特丹大学 招收计算机视觉(CV)方向 全奖博士生
  • 达梦有多少个模式
  • 亚马逊地址关联暴雷:新算法下的账号安全保卫战
  • 四、计算机组成原理——第6章:总线
  • 基于Hadoop3.3.4+Flink1.17.0+FlinkCDC3.0.0+Iceberg1.5.0整合,实现数仓实时同步mysql数据
  • [VLDB 2025]面向Flink集群巡检的交叉对比学习异常检测
  • SVN与GIT的区别,分别使用与哪些管理场景?
  • Go-Elasticsearch Typed Client查询请求的两种写法强类型 Request 与 Raw JSON
  • 正则表达式 速查速记
  • 10、Docker Compose 安装 MySQL
  • flink yarn 问题排查
  • 同态滤波算法详解:基于频域变换的光照不均匀校正
  • 第4章唯一ID生成器——4.3 基于时间戳的趋势递增的唯一ID
  • 测试用例设计常用方法
  • Datawhale AI夏令营--Task2:理解项目目标、从业务理解到技术实现!
  • 用于 Web 认证的 抗量子签名——ML-DSA 草案
  • me.js - 基于angular的前端模块化框架
  • 【氮化镓】GaN同质外延p-i-n二极管中星形与三角形扩展表面缺陷的电子特性
  • 基于Vue3.0+Express的前后端分离的任务清单管理系统
  • 学习Python中Selenium模块的基本用法(2:下载浏览器驱动)
  • 【前端】Tab切换时的数据重置与加载策略技术文档
  • 三角洲摸金模拟器(简易版本)(开源)
  • Claude Launcher:支持Kimi K2的Claude Code可视化启动工具
  • ofd文件转pdf
  • iphone手机使用charles代理,chls.pro/ssl 后回车 提示浏览器打不开该网页
  • 【Spring Boot 快速入门】二、请求与响应
  • 搜索引擎高级搜索指令大全(Google、百度等浏览器通用)