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

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

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


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


算法专栏: 👉🏻123


@[TOC]


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

  • 题目描述:给定两个字符串st,编写一个函数来判断 t 是否是 s 的字母异位词

注意:若 s 和 t 中==每个字符出现的次数都相同==,则称 s 和 t 互为字母异位词。

  • 来源:力扣(LeetCode)
  • 难度:简单
  • 提示:

1 <= s.length,t.length <= 5*10^4^
s 和 t 仅包含小写字母

  • 示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

🌾分析:

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

1.什么是哈希表?

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

  1. 拉链法

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

  1. 线性探测法

线性探测就是探测到发生冲突就存储到哈希表的下一位,这种方法也就要求哈希表长度大于数据长度。

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;
    }
}

image.png


二、🌱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(n^2^) 的==时间复杂度),但是我们使用哈希表可以更简单(哈希查找是==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;
    }
}

image.png


返回第一页。☝


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

相关文章
|
4月前
|
存储 算法
LeetCode第49题字母异位词分组
LeetCode第49题"字母异位词分组"的解题方法,通过将每个字符串的字符排序后作为键存储在HashMap中,有效地将所有字母异位词分组。
LeetCode第49题字母异位词分组
|
2月前
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
17 1
|
2月前
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
23 0
Leetcode第十七题(电话号码的字母组合)
|
2月前
|
索引
【LeetCode 11】242.有效的字母异位词
【LeetCode 11】242.有效的字母异位词
19 0
【LeetCode 11】242.有效的字母异位词
|
2月前
|
算法
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合
42 0
|
4月前
|
算法
LeetCode第17题电话号码的字母组合
该文章介绍了 LeetCode 第 17 题电话号码的字母组合的解法,通过分析得出可使用递归和回溯的思想解决,避免循环穷举的高循环次数,并给出了具体的编码实现,同时总结了该题较难理解,需要了解递归的本质,当嵌套循环层次多时可考虑递归。
LeetCode第17题电话号码的字母组合
|
6月前
|
算法 容器
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
|
6月前
|
存储
力扣经典150题第四十二题:字母异位词分组
力扣经典150题第四十二题:字母异位词分组
38 0
|
6月前
|
存储
力扣经典150题第四十一题:有效的字母异位词
力扣经典150题第四十一题:有效的字母异位词
32 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行