代码随想录-哈希表 2.有效字母的异位词 笔记

本文提供了LeetCode上的两个编程题目解法:1.分组具有相同字母但顺序不同的字符串(GroupAnagrams);2.查找给定字符串中所有与目标字符串具有相同字母频率的子串(FindAllAnagramsinaString)。作者通过使用哈希映射、排序和滑动窗口等技术实现高效求解。
摘要由CSDN通过智能技术生成

第49题

https://leetcode.cn/problems/group-anagrams/description/

解题代码

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
       HashMap<String,List<String >> map= new HashMap<> ();//建立一个hashmap表
       for(String  str:strs){
        char[] array = str.toCharArray();//将string格式转为char数组,为了用Arrays的排序
        Arrays.sort(array);
        String key= new String(array);//将数组转为字符串
         List<String> list = map.getOrDefault(key, new ArrayList<String>());
//如果map中有key,返回key的值放入list中,如果没有,新建一个ArrayList<String>
         list.add(str);
         map.put(key, list);
       }
       return new ArrayList<List<String>>(map.values());
    }
}

438.

. - 力扣(LeetCode)

解题代码

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        //思路:将p按照顺序排列成字符串
        //建立一个数组,用来存储返回值
        //指针从s的头遍历,遍历p的长度,按顺序排列与p的string比较是否相等,相等就返回一个值
        
        char[] arr=p.toCharArray();
        Arrays.sort(arr);
        
        //没考虑s<p
        List num =new ArrayList();
        
        for(int i=0;i<s.length()-p.length()+1;i++){
            String str = s.substring(i,i+p.length());
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            
            if(Arrays.equals(chars,arr)){
                num.add(i);
            }

        }
        return num;
    }
}

官方代码

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        int sLen = s.length(), pLen = p.length();

        if (sLen < pLen) {
            return new ArrayList<Integer>();
        }

        List<Integer> ans = new ArrayList<Integer>();
        int[] sCount = new int[26];
        int[] pCount = new int[26];
        for (int i = 0; i < pLen; ++i) {
            ++sCount[s.charAt(i) - 'a'];//计数,看每个字母有几个
            ++pCount[p.charAt(i) - 'a'];
        }

        if (Arrays.equals(sCount, pCount)) {
            ans.add(0);//第一个字符就符合条件
        }

        for (int i = 0; i < sLen - pLen; ++i) {//开始滑动,窗口每次滑动一位
            --sCount[s.charAt(i) - 'a'];//减去前一个窗口的值
            ++sCount[s.charAt(i + pLen) - 'a'];//在滑动窗口内维护每一个字母的数量
//加上滑动后新加入的值

            if (Arrays.equals(sCount, pCount)) {
                ans.add(i + 1);
            }
        }

        return ans;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/solutions/1123971/zhao-dao-zi-fu-chuan-zhong-suo-you-zi-mu-xzin/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值