字母异位词——将数组当作哈希表用

1.有效的字母异位词

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

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
在这里插入图片描述
有效的字母异位词

思路:
1.创建一个大小为26的数组,用来记录每个小写字母出现的次数
2.分别收集两个字符串中的字母
3.看数组是否为0

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] record = new int[26];

        //收集s中各个字母的数量和种类,放在数组中
        for(char ch:s.toCharArray()){
            record[ch-'a']+=1;
        }

        //与t中各个字母的数量和种类相比较
        for(char ch:t.toCharArray()){
            record[ch-'a']-=1;
        }

        //看当前数组元素是否为0
        for(int i : record){
            if(i!=0)  return false;
        }

        return true;
    }
}

2.赎金信

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。

在这里插入图片描述

赎金信

思路:同上

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int[] record =new int[26];

        //收集ransomNote的字符数量和种类
        for(char ch:ransomNote.toCharArray()){
            record[ch-'a']+=1;
        }

        //释放magazine的字符和数量
        for(char ch:magazine.toCharArray()){
            record[ch-'a']-=1;
        }

        //遍历record中的字母个数
        for(int i :record){
            if(i>0)  return false;  
        }
        return true;
    }
}

3.字母异位词分组

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

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
在这里插入图片描述

字母异位词分组

1.创建一个哈希表
2.将字符串转换为字符数组,并按字母表顺序排序。
3.将排序后的字符数组转换成字符串,并作为哈希表的key值
4.比较哈希表是否有key值,若没有,则将key值放入表中
5.将该key对应的value值放入表中

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        if(strs==null||strs.length==0){
            return new ArrayList();
        }

        Map<String, List> map = new HashMap<String ,List>();
        for(String s : strs){
            //将字符串转换为字符数组
            char[] chs = s.toCharArray();
            //将字符数组按照字母顺序排序
            Arrays.sort(chs);
            //将排序后的字符串作为哈希表中的key值
            String key = String.valueOf(chs);
            //判断哈希表中是否有key值
            if(!map.containsKey(key)){
                map.put(key,new ArrayList());
            }
            //将该字符串放在对应key的list中
            map.get(key).add(s);//根据key获得相应的val,然后放在list中
        }
        return new ArrayList(map.values());
    }
}

4.找到字符串中所有字母异位词

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

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
在这里插入图片描述

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

思路:
1.创建两个大小为26的数组,用于记录字母出现的数量
2.以p的长度为基准,分别统计该长度范围内字母的数量
3.倘若两个数组equals,将0添加到list中
4.记录s中剩下长度的数组,并且一边记录新字母数量,一边删除旧字母。
5.倘若两个数组相等,将当前下标放入list中。

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> ans = new ArrayList();//用于存放答案
        int[] sRecord = new int[26];
        int[] pRecord = new int[26];
        int sLen = s.length();
        int pLen = p.length();
        if(sLen<pLen){
            return ans;
        }

        //统计字符串中的字母数量,分别放在两个数组中,先以较短的为基准
        for(int i =0;i<pLen;i++){
            sRecord[s.charAt(i)-'a']++;
            pRecord[p.charAt(i)-'a']++;
        }
        //如果两个数组完全相同,则输出0位置
        if(Arrays.equals(sRecord,pRecord)){
            ans.add(0);
        }
        //统计s中剩下的字符数量
        for(int i =pLen;i<sLen;i++){
            sRecord[s.charAt(i-pLen)-'a']--;//清空s数组
            sRecord[s.charAt(i)-'a']++;
            //如果此时两个数组完全相等
            if(Arrays.equals(sRecord,pRecord)){
               ans.add(i-pLen+1);
            }
        }
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值