首页 > 编程语言 >算法刷题记录-哈希表

算法刷题记录-哈希表

时间:2023-11-16 11:13:21浏览次数:24  
标签:arr String 示例 异位 magazine 算法 哈希 new 刷题

算法刷题记录-哈希表

有效的字母异位词

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

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

示例 1:

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

示例 2:

输入: s = "rat", t = "car"
输出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • st 仅包含小写字母

思路:用两个hashmap分别存储两个字符串字符出现次数,比较两个map是不是所有的值都相同。需要注意的是字典值得比较用equals

public boolean isAnagram(String s, String t) {
    HashMap<Character,Integer> map1=new HashMap<>();
    HashMap<Character,Integer> map2=new HashMap<>();
    for (int i = 0; i < s.length(); i++) {
        if(!map1.containsKey(s.charAt(i)))map1.put(s.charAt(i),0);
        else map1.put(s.charAt(i), map1.get(s.charAt(i))+1);
    }
    for (int i = 0; i <t.length(); i++) {
        if(!map2.containsKey(t.charAt(i)))map2.put(t.charAt(i),0);
        else map2.put(t.charAt(i), map2.get(t.charAt(i))+1);
    }
    if(map1.size()!=map2.size())return false;
    for (char i:map1.keySet()) {
        if(!map1.get(i).equals(map2.get(i))) {
            return false;
        }

    }
    return true;
}

解法二:用一个map,第一个循环把存s,第二个循环删t中的字符

public boolean isAnagram(String s, String t) {
    HashMap<Character,Integer> map1=new HashMap<>();

    for (int i = 0; i < s.length(); i++) {
        if(!map1.containsKey(s.charAt(i)))map1.put(s.charAt(i),1);
        else map1.put(s.charAt(i), map1.get(s.charAt(i))+1);
    }
    for (int i = 0; i <t.length(); i++) {
        if(map1.containsKey(t.charAt(i)))map1.put(t.charAt(i),map1.get(t.charAt(i))-1);
        else {
            return false;
        }
        if(map1.get(t.charAt(i)).equals(0)) {
            map1.remove(t.charAt(i));
        }
    }
    if(map1.size()!=0)return false;

    return true;

放一个他人得解法,其实思路一样,但是这种做法省去了hashmap大量得比较、判断。更快

public boolean isAnagram(String s, String t) {
    if(s.length() != t.length()) return false;
    int[] arr = new int[26];
    for(char c : s.toCharArray())
        ++arr[c - 'a'];
    for(char c : t.toCharArray()){
        --arr[c - 'a'];
        if(arr[c - 'a'] < 0) return false;
    }
    return true;
}

赎金信

给你两个字符串:ransomNotemagazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false

magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:

输入:ransomNote = "a", magazine = "b"
输出:false

示例 2:

输入:ransomNote = "aa", magazine = "ab"
输出:false

示例 3:

输入:ransomNote = "aa", magazine = "aab"
输出:true

提示:

  • 1 <= ransomNote.length, magazine.length <= 105
  • ransomNotemagazine 由小写英文字母组成

与上一题基本类似,这里加字典顺序换一下,先把第二个字符串加进去,在判断能不能满足第一个字符串

public boolean canConstruct(String ransomNote, String magazine) {
    if(ransomNote.length()>magazine.length())return false;
    int[] arr = new int[26];
    for(char c : magazine.toCharArray()) {
        ++arr[c - 'a'];

    }
    for(char c : ransomNote.toCharArray()) {
        if(arr[c-'a']<=0)return false;
        else {
            --arr[c - 'a'];
        }
    }
    return true;
}

字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

思路:暴力解法,双重循环。

public List<List<String>> groupAnagrams(String[] strs) {
    List<List<String>> res=new ArrayList<>();
    if(strs.length==0)return res;
    for(String s:strs){
        boolean flag=false;
        if(res.size()==0){
             List<String> temp=new ArrayList<>();
             temp.add(s);
             res.add(temp);
        }
        else {
            for(List<String> temp:res){
                if(isAnagram(s, temp.get(0))){
                    temp.add(s);
                    flag=true;
                    continue;
                }
            }
            if(flag)continue;
            List<String> temp=new ArrayList<>();
            temp.add(s);
            res.add(temp);
        }

    }

    return res;
}

public boolean isAnagram(String s, String t) {
    if(s.length() != t.length()) return false;
    int[] arr = new int[26];
    for(char c : s.toCharArray())
        ++arr[c - 'a'];
    for(char c : t.toCharArray()){
        --arr[c - 'a'];
        if(arr[c - 'a'] < 0) return false;
    }
    return true;
}

找到字符串所有的字母异位词

给定两个字符串 sp,找到 s 中所有 p异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

思路:暴力解法,以每一个索引判断字串是否有可能匹配

public List<Integer> findAnagrams(String s, String p) {
    List<Integer> res=new ArrayList<>();
    if(s.length()<p.length())return res;
    int low=0;
    while (low<s.length()-p.length()){
        if(isAnagram(s.substring(low,low+p.length()),p))res.add(low);
        low++;
    }
    return res;
}

public boolean isAnagram(String s, String t) {
    if(s.length() != t.length()) return false;
    int[] arr = new int[26];
    for(char c : s.toCharArray())
        ++arr[c - 'a'];
    for(char c : t.toCharArray()){
        --arr[c - 'a'];
        if(arr[c - 'a'] < 0) return false;
    }
    return true;
}

标签:arr,String,示例,异位,magazine,算法,哈希,new,刷题
From: https://www.cnblogs.com/hfutxcj/p/17835757.html

相关文章

  • KMeans算法全面解析与应用案例
    本文深入探讨了KMeans聚类算法的核心原理、实际应用、优缺点以及在文本聚类中的特殊用途,为您在聚类分析和自然语言处理方面提供有价值的见解和指导。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验......
  • 测试开发常见算法题
    1.冒泡排序deffaet_sort(test:list)->list:"""冒泡排序"""foriinrange(len(test)):forjinrange(len(test)-i-1):iftest[j]>test[j+1]:test[j],test[j+1]=test[j+1],te......
  • 算法~base64算法理解
    base64Base64是一种用于将二进制数据编码成ASCII字符的编码方式。它主要用于在文字环境中传输或存储二进制数据,如在电子邮件、XML文件、URL参数等。Base64编码不是一种加密算法,而是一种编码方式,其主要作用是将二进制数据转换为文本数据,以便更容易在文本协议中处理。Base64......
  • 对匈牙利算法的一些解释
    首先看蓝书上的代码为什么即将开始dfs时,没有一开始就把vis[i]标记了?其实dfs的流程是从左部的一个节点出发,考察右部的一个节点,如果右部的节点已经匹配了,下次dfs直接从这个右部节点的匹配点开始计算,所以vis的标记都是标记的右部节点,左部节点是不用标记的(因为是匹配二分图,只会被访......
  • 【路径规划】基于动态窗口法DWA算法的机器人动态避障路径规划研究附Matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 【刷题笔记】110. Balanced Binary Tree
    题目Givenabinarytree,determineifitisheight-balanced.Forthisproblem,aheight-balancedbinarytreeisdefinedas:abinarytreeinwhichthedepthofthetwosubtreesofeverynodeneverdifferbymorethan1.Example1:Giventhefollowingtree......
  • 【iOS逆向与安全】某茅台App算法分析还原
    1.目标某茅台软件的actParam算法分析还原。2.使用工具mac系统frida-ios-dump:砸壳已越狱iOS设备:脱壳及frida调试IDAPro:静态分析Charles:抓包工具ss:小火箭,配合Charles使用3.流程处理启动闪退在IDAPro搜索SVC得到如下函数列表:NOP掉sub_函数的最后一行汇编......
  • 【课程】算法设计与分析——第八周 题解笔记
    第八周算法题解笔记1极值点题目描述给定一个单峰函数f(x)和它的定义域,求它的极值点该单峰函数f(x)保证定义域内有且只有一个极值点,且为极大值点题解本题感觉和dp关系不大,主要思路是三分法,和二分法非常类似,但没有二分法常用,主要用途是用来求单峰函数的极值对于任意一个......
  • 浙江大学数据结构陈越 第一讲 数据结构和算法
    数据结构数据结构是计算机科学中用来组织和存储数据的方式。它可以理解为一种组织数据的方式,能够有效地管理和操作数据,以及提供对数据进行存储、检索、更新和删除等操作的方法。常见的数据结构包括数组、链表、栈、队列、树和图等,它们各自适用于不同的应用场景,并且有着不同的特点和......
  • 【golang】Golang 哈希码 hashcode 输入一个字符串,得到一个唯一标识码
    如何输入一个字符串,得到一个唯一的hashcode?例子如下:packagemainimport("fmt""hash/crc32")//Stringhashesastringtoauniquehashcode.////crc32returnsauint32,butforouruseweneed//andnonnegativeinteger.Herewec......