【Leetcode刷题】【242】有效的字母异位词【49】字母异位分组【219】存在重复元素II

242题目描述

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

在这里插入图片描述

思路

1.hashmap
我们可以用两个hashmap,分别存储两个字符串对应的字母和出现频次,然后比较两个map是否一样,用equals,一样说明是异位的。


```java
class Solution {
public boolean isAnagram(String s, String t) {
     if (s.length()!=t.length()) {//字符串长度不相等,直接返回
		return false;
	 }
    
     HashMap<Character, Integer> map1=new HashMap<Character,Integer>();
     for(int i=0;i<s.length();i++) {
    	 char c=s.charAt(i);
    	 if(!map1.containsKey(c)){//判断该字符是否已经在map中存在,不存在则加入map
             map1.put(c,1);
         }
         else{
             map1.put(c,map1.get(c)+1);//存在则value加一
         }
     }
     HashMap<Character, Integer> map2=new HashMap<Character,Integer>();
     for(int i=0;i<t.length();i++) {
    	 char c=t.charAt(i);
    	 if(!map2.containsKey(c)){
             map2.put(c,1);
         }
         else{
             map2.put(c,map2.get(c)+1);
         }
     }
     
     return map1.equals(map2);//最后比对两个map,看是否相等。
 }
}

49题目描述

在这里插入图片描述

思路

1.首先声明一个hashmap,然后 key为排序后的词,因为异位词排序后都一样,所以可以借此分成不同组。
2.value设置为string类型的list,每遇到自己key下的字符串时,加入list中
3.最后遍历map中所有的values,然后加入到新建的链表中。

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> res = new LinkedList<>();
        Map<String, List<String>> map = new HashMap<>();
        //O(n), n = the length of strs
        for(int i = 0; i < strs.length; i ++){

            String s = strs[i];
            char[] c = s.toCharArray();//将字符串拆分成字符然后存入char类型数组
            //O(k*log^k), k = the longest string in strs
            Arrays.sort(c);//从小到大排序
            s = new String(c);//转换成字符串
            if(map.containsKey(s)){//判断是否包含该字符串
                List<String> list = map.get(s);
                list.add(strs[i]);
                map.put(s, list);
            }
            else {//不包含则新建链表,将key对应的数组值加入链表中,再将list加入map中
                List<String> list = new LinkedList<>();
                list.add(strs[i]);
                map.put(s, list);
            }
        }
        //O(m), m = the number of anagram group
        for(List list : map.values())
            res.add(list);//遍历map中的values,存入新链表

        return res;


    }
}

219题目描述

在这里插入图片描述

思路

1.创建一个hashmap,然后key为元素值,value为对应的数组下标
2.然后遍历数组,判断map中是否包含重复元素,也就是key是否已经存在,且重复元素的下标与前一个下标之差是否不大于k,若是,则返回true
3.否则,就是往里更新该元素对应的下标.

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {

     HashMap <Integer,Integer> map=new HashMap<>();
     for(int i=0;i<nums.length;i++){
         if(map.containsKey(nums[i])&&(i-map.get(nums[i]))<=k){
             return true;
         }
         map.put(nums[i],i);
     }
     return false;
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱技术的小小林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值