刷leetcode——代码随想录(二)

文章介绍了如何利用哈希表和不同的算法(如数组计数和滑动窗口)来检测字符串之间的字母异位词,包括有效字母异位词的判断和分组,以及在一个字符串中查找所有字母异位词的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、哈希表

242.有效的字母异位词

解题思路+代码

 没有用哈希表来做。创建一个新的列表来存储26个字母对应的个数。首先判断s和t长度是否一致,不一致直接返回false。接下来,进入循环,每个字母减去’a‘对应的数字为存储这个字母个数的下标,对于s出现的字母--,对于t出现的字母++。最后遍历这个列表,如果其中有值不为0就返回false,如果全部为0,则返回true。 

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

    }
}

49.字母异位词分组 

解题思路+代码 

     这道题用hashmap来做,将每个单词排序后的顺序作为key值,判断key值是否已经存在,不存在的话创建新列表,存在的话返回key对应的列表。最后将,加入新单词的key和list放入hashmap。

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        HashMap<String,List<String>> hashmap = new HashMap<String, List<String>>();
        for(String str : strs){
            char[] array = str.toCharArray();
            Arrays.sort(array);
            String key = new String(array);
            List<String> list = hashmap.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            hashmap.put(key,list);
        }
        return new ArrayList<List<String>>(hashmap.values());

    }
}

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

解题思路+代码

    创建两个新的列表分别来存s和p26个字母对应的个数。先判断和p长度相同的s,如果两个列表完全相同的话,则输出list加0。然后采用滑动窗口思想,固定滑动窗口大小,从s的最左边开始,滑动窗口大小为p的长度,每次向右滑动一位,滑动后给滑动前窗口最左边的字母个数减一,给滑动后最右边字母的个数加一,如果这时两个计数列表完全相同的话,则list加上滑动后最左边的位置,即i+1。

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        int sLen = s.length(), pLen = p.length();
        if(sLen < pLen){
            return new ArrayList<Integer>();
        }
        ArrayList<Integer> list = 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)){
            list.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)){
                list.add(i + 1);
            }
        }
        return list;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值