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

LeetCode:242. 有效的字母异位词

🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123


文章目录

  • 一、🌱[242. 有效的字母异位词](https://leetcode.cn/problems/valid-anagram/)
    • 🌾分析:
      • 1.什么是哈希表?
      • 2.哈希表的数据结构
    • 🌴解题
  • 二、🌱[349. 两个数组的交集](https://leetcode.cn/problems/intersection-of-two-arrays/)
    • 🌴解题


一、🌱242. 有效的字母异位词

  • 题目描述:给定两个字符串st,编写一个函数来判断 t 是否是 s 的字母异位词
    注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

  • 来源:力扣(LeetCode)

  • 难度:简单

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

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

🌾分析:

对于这里在多个内容中找是否出现有某内容,可以使用hash表-哈希表。

1.什么是哈希表?

哈希表是根据关键码的值而直接进行访问的数据结构。就可以认为是一个数组,关键码就是指这个元素一个存储在数组的哪个位置。在👉🏻Set集合里面就有个HashSet,会根据hashcode(哈希值)来存储元素。
要在一个数组中查找一个元素,去一个个遍历,这个复杂度就是O(n),而使用哈希表复杂度是O(1)。
在哈希表存储元素的过程中,可能存储的元素得到的哈希值大于你的数组下标,我们通常会对哈希值进行取余操作后放入对应的数组位置。
然而这个时候又有可能几个元素取余之后的元素是一样的,那不可能把几个元素放到一个数组格子里吧!这就是哈希碰撞。解决这类问题的方法有两种:拉链法线性探测法

  1. 拉链法
    拉链那个当然是拉出一个链表结构来解决冲突了,就是说把发送冲突的元素存储在链表中,以后查找到哈希值直接到链表里寻找。这一类方法要选择好合适的哈希表长度,避免浪费哈希表的数组空间,也同时避免过长的链表减低查找性能。
  2. 线性探测法
    线性探测就是探测到发生冲突就存储到哈希表的下一位,这种方法也就要求哈希表长度大于数据长度。

2.哈希表的数据结构

前面提到哈希表可以使用数组、set集合,其实哈希表还可以使用map,java基础篇👉🏻提到的hashsethashmap,参考:Map集合的使用-Java。map是一种key-value的存储结构,可以用key保存数值,用value在保存数值所在的下标。

🌴解题

  • 数组
    题目说明了都是小写字母字符,所以直接使用数组长度为26,记录每个字母在s中出现的次数,抵消t中出现的次数,最后遍历数组,不为0就是出现次数不相同。

  • code

class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length())
            return false;
        int[] tar=new int[26];
        for (int i = 0; i < s.length(); i++) {
            tar[s.charAt(i)-'a']++;
       
            tar[t.charAt(i)-'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if(tar[i]!=0)
                return false;
        }
        return true;
    }
}

在这里插入图片描述


二、🌱349. 两个数组的交集

  • 题目描述:给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以不考虑输出结果的顺序

  • 来源:力扣(LeetCode)

  • 难度:简单

  • 提示:
    1 <= nums1.length, nums2.length <= 1000
    0 <= nums1[i], nums2[i] <= 1000

  • 示例 1:
    输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    输出:[9,4]
    解释:[4,9] 也是可通过的

🌴解题

  • HashSet
    题目要求我们找到两个数组元素的相同元素,当然也可以使用for循环暴力解决( 是O(n2) 的时间复杂度),但是我们使用哈希表可以更简单(哈希查找是O(1) 的时间复杂度,整体复杂度是O(n) 的)。我们可以建立两个哈希集合,先把第一个数组加进集合,遍历第二个数组的时候如果对于元素出现在集合中就把改元素存储下来,最后得到结果。

  • code

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {

        Set<Integer> a1=new HashSet<>();
        Set<Integer> a2=new HashSet<>();
        for (int i = 0; i < nums1.length; i++) {
            a1.add(nums1[i]);
        }
        for (int i = 0; i < nums2.length; i++) {
            if(a1.contains(nums2[i]))
                a2.add(nums2[i]);
        }
        int[] ans=new int[a2.size()];
        int i=0;
        for (int o : a2) {
            ans[i++]=o;
        }

        return ans;
    }
}

在这里插入图片描述


🌵Bug本是code常态,通过才是稀缺的意外!🌷

返回第一页。☝


☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓


http://www.kler.cn/a/4508.html

相关文章:

  • Spring Boot + MyBatis-Flex 配置 ProxySQL 的完整指南
  • 如何通过openssl生成.crt和.key
  • vue3 uiapp实现一个数字输入组件, 舒服非数字会默认转成最小数
  • SQL面试题1:连续登陆问题
  • Spring Boot教程之五十六:用 Apache Kafka 消费 JSON 消息
  • 【EI 会议征稿】第四届材料工程与应用力学国际学术会议(ICMEAAE 2025)
  • MySQL OCP888题解063-突然变慢的可能原因
  • 【Autoware规控】Lattice规划节点
  • CentOS挂载U盘拷贝文件
  • 【基础算法】1-2:归并排序
  • MyBatis-Plus联表查询(Mybatis-Plus-Join)
  • RabbitMQ高级
  • 使用c++超详细解释数据结构中的顺序栈和链栈
  • 大模型多模态Chatgpt+自动驾驶控制器设计方案
  • 入行芯片设计选模拟IC还是数字IC?一文为你讲解清楚
  • 树莓派云浇水--上层搭建自研版 :P
  • DJ2-5 读者-写者问题
  • 完全二叉树的4种遍历方式
  • 【Python语言基础】——Python 关键字
  • 一个PHP实现的轻量级简单爬虫
  • Java中的volatile关键字的作用
  • 《Spring系列》第11章 别名机制
  • UART、RS232 、RS485 区别
  • Kotlin的数据流
  • java反编译工具
  • Springboot整合rabbitmq并实现消息可靠性和持久性