DAY 33 leetcode 383--哈希表.赎金信 49--字母异位词分组
题号383
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
class Solution {
public boolean canConstruct(String r, String m) {
HashMap<Character, Integer> dic=new HashMap<>();//创建哈希表
int r_size=r.length();
int m_size=m.length();
for(int i=0;i<m_size;i++){
dic.put(m.charAt(i),dic.getOrDefault(m.charAt(i),0)+1);
}//先对m操作
for(int i=0;i<r_size;i++){
dic.put(r.charAt(i),dic.getOrDefault(r.charAt(i),0)-1);
}//再将r中的元素减去
for(int val:dic.values()){
if(val<0)//若有负数出现则说明出现了其他字符
return false;
}
return true;
}
}
题号49
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
我的写法
大致思路:创建一个哈希表,key是计数数组生成的字符串,values是strs[i],则可以将计数数组相同的字符串放在同一列表下,但是这种方法时间复杂度高
import java.util.*;
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
int n = strs.length;
HashMap<String, List<String>> map = new HashMap<>();
for (int i = 0; i < n; i++) {
// 不能直接用数组作为键,使用计数数组生成的字符串作为键
String key = Arrays.toString(count(strs[i]));
List <String> list=map.getOrDefault(key,new ArrayList<String>());
//如果存在key 则返回与该键关联的 List<String>
//如果不存在,则返回一个新的 ArrayList<String> 实例
list.add(strs[i]);
map.put(key,list);
}
// 返回包含所有列表的列表
return new ArrayList<List<String>>(map.values());
}
public int[] count(String s) {
int[] arr = new int[26];
int size = s.length();
for (int i = 0; i < size; i++) {
arr[s.charAt(i) - 'a']++;
}
return arr;
}
}